Оптимизация: профайлер и LOD

Урок про то, как находить и устранять причины тормозов в игре на Unreal.

Профилирование — это измерение того, на что тратится время кадра, чтобы найти настоящую причину низкого FPS, а не угадывать её.

Сначала измерить, потом чинить

Главное правило оптимизации: не оптимизируйте вслепую. Сначала измерьте, где узкое место — в процессоре (CPU, игровая логика) или видеокарте (GPU, рендеринг). Иначе вы потратите дни на ускорение того, что и так быстро.

Инструменты профилирования

Команда / инструментЧто показывает
stat fpsТекущий FPS и время кадра
stat unitРазбивку: Game (CPU), Draw, GPU
stat gameЧто тратит время в игровой логике
Unreal InsightsПодробный трейс всего кадра

Команда stat unit — первый шаг: если велик Game — узкое место в CPU/логике; если велик GPU — в графике; если велик Draw — слишком много draw calls.

LOD и draw calls

Каждый видимый меш требует draw call — команду видеокарте отрисовать его. Чем их больше, тем медленнее. Снизить нагрузку помогают LOD (упрощённые версии моделей вдали), объединение мелких мешей и культинг (отсечение невидимого). Хотя Nanite во многом решает проблему геометрии, для не-Nanite объектов LOD по-прежнему важны.

Дешёвые победы

  • Отключите Tick у объектов, которым он не нужен — это бесплатная экономия CPU.
  • Уменьшите дальность и качество теней, если они бьют по GPU.
  • Сократите число динамических источников света — они дороги.
  • Не считайте тяжёлую логику каждый кадр; кешируйте результаты.

Как работает под капотом

Кадр делится на работу CPU (логика, подготовка сцены) и GPU (отрисовка). Они идут конвейером: пока GPU рисует один кадр, CPU готовит следующий. FPS ограничен тем из них, что медленнее. Профайлер показывает это разделение, и оптимизировать нужно именно «бутылочное горлышко» — ускорение быстрой части не даст прироста.

Частые ошибки

  • Оптимизировать без замера. Угадывание узкого места — потеря времени.
  • Ускорять не ту часть. Если упёрлись в GPU, оптимизация логики не поможет.
  • Tick на всём. Сотни объектов с ненужным Tick тихо съедают CPU.

Бюджет кадра и память

У оптимизации есть ориентир — бюджет кадра. Чтобы держать 60 кадров в секунду, на каждый кадр отведено около 16 миллисекунд; для 30 FPS — около 33. Всё, что движок делает за кадр (логика, отрисовка, физика), должно уложиться в это время. Профайлер показывает, на что миллисекунды тратятся, и задача — уместить работу в бюджет. Думать в миллисекундах полезнее, чем в абстрактном «быстро/медленно»: вы сразу видите, сколько у вас есть и сколько уже занято.

Вторая ось — память. Огромные текстуры и несжатые звуки незаметно съедают видеопамять и оперативную память, и на машинах послабее игра начинает «свопиться» и заикаться. Инструменты вроде Texture Streaming и команды статистики памяти помогают найти прожорливые ассеты. Оптимизация — это всегда балансировка двух бюджетов, времени кадра и памяти, под целевое железо вашей аудитории, а не бесконечная погоня за абстрактной скоростью.

Итоги

  • Сначала измеряйте профайлером, потом оптимизируйте.
  • stat unit показывает, где узкое место: Game (CPU), Draw или GPU.
  • LOD, объединение мешей и культинг снижают нагрузку на рендеринг.
  • Отключение лишнего Tick и кеширование — дешёвые победы.
Проверьте себя
1. Какое первое правило оптимизации?
AСразу уменьшить текстуры
BСначала измерить узкое место профайлером
CОтключить графику
DПереписать всё на C++
2. Что показывает команда stat unit?
AСписок ассетов
BРазбивку времени кадра на Game (CPU), Draw и GPU
CРазмер игры
DВерсию движка
3. Почему стоит отключать Tick у объектов, которым он не нужен?
AЭто улучшает графику
BЛишний Tick впустую тратит время CPU каждый кадр
CЭто требование лицензии
DИначе игра не соберётся