Комментарии 9
Результат — отличный и статья очень хорошая. Особенно для статьи из песочницы, спасибо.
А какая разница, ставим мы PropertyBlock или меняем данные в свойстве уникального материала? Ведь оно внутри все-равно будет раздельно рендерить эти спрайты / меши. Нужно либо шить данные в меш (в вертексы напрямую, дополнительный vertex stream тоже не батчится), либо использовать инстансинг.
Про clip (который на самом деле макрос поверх discard) тоже стоило сказать, что применять можно только на десктопе — на мобильных гпу это вызывает сильное падение производительности.
Про clip (который на самом деле макрос поверх discard) тоже стоило сказать, что применять можно только на десктопе — на мобильных гпу это вызывает сильное падение производительности.
Да, динамический бачинг не будет работать, хоть в результате мы и используем один материал, но MaterialPropertyBlock и [PerRendererData] позволяет нам тратить меньше ресурсов на изменение свойств. При том, что нужно всего пару строк кода.
Я использовал clip в версиях игры для android/ios и не замечал проблем с производительностью. Возможно, объектов, использовавших этот шейдер было недостаточно, но теперь мне интересно это проверить:)
Результаты профайлера
В левой части результат работы с MaterialPropertyBlock и [PerRendererData], а в правой без них. На тестовой сцене использовалось 2000 объектов (3D)
В левой части результат работы с MaterialPropertyBlock и [PerRendererData], а в правой без них. На тестовой сцене использовалось 2000 объектов (3D)
Я использовал clip в версиях игры для android/ios и не замечал проблем с производительностью. Возможно, объектов, использовавших этот шейдер было недостаточно, но теперь мне интересно это проверить:)
В случае clip — это discard + бранчинг. По поводу графика — что-то странное творится в коде, потому что кода не может быть больше — просто щупаешь material вместо sharedMaterial и ставишь свойство. Внутри происходит неконтролируемая ленивая инициализация уникального материала на первом вызове и все — это не часть пользовательского кода, которая на графике почему-то увеличила вычислительную нагрузку в 3 раза как минимум.
Увеличенная нагрузка — оверхэд на загрузку данных в GPU.
На тему MaterialPropertyBlock vs non-shared material: thomasmountainborn.com/2016/05/25/materialpropertyblocks
На тему MaterialPropertyBlock vs non-shared material: thomasmountainborn.com/2016/05/25/materialpropertyblocks
Уточню — клип ломает блочную отрисовку кадра (забыл как правильно по-английски).
Типа он мог бы рисовать кадр кусками сразу по сколько пикселей, если бы поведение каждого пикселя было предсказуемым. А клип и бранчинг это дело ломает.
Типа он мог бы рисовать кадр кусками сразу по сколько пикселей, если бы поведение каждого пикселя было предсказуемым. А клип и бранчинг это дело ломает.
В целом статья понравилась, аккуратно и подробно все расписано.
Не хватило упоминания о том, что GrabPass на мобильных устройствах очень тяжелая операция, потому и постэффекты на мобилках стараются не использовать — большая нагрузка на ширину шины оперативной памяти.
Не хватило упоминания о том, что GrabPass на мобильных устройствах очень тяжелая операция, потому и постэффекты на мобилках стараются не использовать — большая нагрузка на ширину шины оперативной памяти.
Спасибо, классная статья.
Замена if на Step() это как масло сливочное "крестьянское" сливочным "деревенским" заменить.
Функция Step() как и if компилируется в один и тот же код в итоге.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Написание шейдеров в Unity. GrabPass, PerRendererData