
Алехандро Нуньес показал, как заставить Unity работать значительно быстрее: за месяц он сделал масштабную RTS The Last General гораздо плавнее и добился трёхкратного роста FPS. Более того, он разобрал ключевые приёмы и поделился ими с сообществом.
Старт — с профилировщика: сначала он выявил самые «тяжёлые» места по CPU и GPU в проекте на ECS (Entity Component System) и DOTS (Data-Oriented Technology Stack). После этого начал точечно снимать узкие горлышки.
Главный прорыв — радикальное сокращение числа батчей. Проблема в том, что Entities Graphics не объединяет отрисовку, если сущности созданы в разное время. Решения два: либо инстанцировать все нужные объекты одновременно, либо сбросить компонент EntitiesGraphicsChunkInfo в default для группы сущностей, чтобы система пересобрала батчи. Делать это надо в один и тот же кадр для всех объектов, которые вы хотите поместить в общий батч. В результате у Нуньеса количество батчей упало примерно на 90%, что дало огромный выигрыш и по CPU (меньше диспетчеризации тысяч батчей), и по GPU (существенно меньше команд рендеру).
Практический совет: соберите, к примеру, все астероиды (если они должны рендериться вместе) и массово переведите им EntitiesGraphicsChunkInfo → default. Параллельно проверьте проект в RenderDoc, чтобы увидеть, какие объекты по ненужным причинам попадают в мелкие отдельные батчи — именно их и надо «схлопывать».
Второй пласт оптимизации — повышение заполнения чанков (целитесь в ~128 сущностей на чанк). В некоторых местах разработчик разделил сущности на две: «физика/логика» и «рендер». Это улучшило occupancy и позволило более агрессивно отключать рендер на дистанции, оставляя активными коллайдеры и игровую логику.
Дополнительно помогли:
-
Перестановка систем и разрыв read/write-зависимостей между джобами и системами.
-
Отказ от параллелизма для очень коротких задач (оверход на синхронизацию дороже выгоды).
-
Замена текстов в world-space на Latios Calligraphics вместо обычных текст-GameObject’ов.
-
Сокращение количества дочерних сущностей, чтобы уменьшить время CalculateHierarchyLocalToWorld.
-
Компоновка статических коллайдеров и использование incremental static broadphase в физике.
-
Сон по сетке: грид, который переводит объекты в статичные, если в ячейке ничего не двигается — так меньше просчётов.
Следить за прогрессом The Last General и новыми техниками Нуньеса можно на его странице в Reddit — он регулярно делится измерениями и практическими примерами.

Комментарии (3)