Блог

Разработчик объяснил, как утроил FPS своей игры на Unity



Алехандро Нуньес показал, как заставить 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)

Сброс EntitiesGraphicsChunkInfo — золото. У меня батчи тоже падали лавинообразно, а профайлер по CPU наконец перестал гореть красным.
Разделение логики и рендера спасло мобильную версию. Раньше приходилось урезать эффекты, теперь просто гашу рендер далеко и не трогаю коллайдеры.
Самое полезное — мыслить данными, а не объектами. Перестал “параллелить всё подряд”, разорвал зависимости — и фреймтайм стабилизировался лучше любого апскейла.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.