Unity3d Static Batching fix

UPD: в Unity3d 2023.1.0a5 эта проблема исправлена, подтверждение от Unity по ссылке ниже

Содержание статьи:

Пока сёрфил интернет в поисках внятной информации об оптимизации Unity3d наткнулся на тему на форуме

А уже в ней на GitHub репозиторий

Суть проблемы:

- сцена с множеством MeshRenderer'ов, различными Material'ами и большая по площади

- включаем Static Batching

- полученные batch’и имеют хаотичную форму и масштабы, что приводит к бесполезной нагрузке при её отрисовке. Это происходит потому, что алгоритм, который выбирает что с чем сшить, не упорядочивает объекты по положению в пространстве. На форуме разработчики из Unity Technologies признают проблему

- Эта проблема может быть особенно болезненна для Top-down и side-scrolling игр, где вы в камере видите очень маленькую часть от большой сцены. Неудачный Static Batching сильно повысит количество геометрии в кадре (в том числе и тени), а следовательно и нагрузку на GPU

- я писал для работы решение, основанное на том, что в редакторе мы сортируем MeshRenderer’ы по координатам, складываем в списке, а в Runtime сшиваем их вручную с помощью StaticBatchingUtility.Combine(GameObject)

- Решение представленное на GitHub я не тестировал, но оно мне видится более удобным и лаконичным, там прямо в .dll'ках движка подменяется алгоритм сортировки объектов сцены для Static Batching'а, чтобы он учитывал упорядочивание их в пространстве

Считаю, что проблема неоправданно привлекла мало внимания со стороны Unity Technologies, и о таких оптимизациях вам не расскажут в очередном 5-50 минутном по оптимизации с помощью Profiler / Static Batching и т.п.

На следующих скриншотах случайными цветами выделены отдельные batch'и при Static Batching'е

Static Batching  при актуальной сортировке объектов<br />
Static Batching  при актуальной сортировке объектов
Static Batching после применения патча с сортировкой по положению в пространствве<br />
Static Batching после применения патча с сортировкой по положению в пространствве

- мы в проекте отказались от Static Batching, из-за требуемого огромного объема ОЗУ и при использовании GPU-Instancing и Dynamic Batching мы видели FPS выше. Но если для вас ОЗУ не проблема, и при тестах Static Batching показывает лучше FPS, рекомендую:

- воспользоваться патчем с GitHub

- написать собственное решение аналогичное моему

Всем успехов в ваших проектах

33
Начать дискуссию