Unreal Engine — это мощь, графика, кинематографичность. Но за эту мощь приходится платить: сложные проекты могут упираться в производительность, превращая разработку в борьбу за миллисекунды. Оптимизация под UE — это целое искусство, выходящее далеко за рамки стандартного «понизьте качество текстур». Мы поговорили с техническими директорами и тимлидами из геймдев- и индустриальных студий, которые ежедневно выжимают максимум из движка, и собрали их нетривиальные секреты мастерства.
«Первое правило — это профайлинг, профайлинг и еще раз профайлинг. Но не просто смотреть на общие цифры в Unreal Insights или GPUView, — начинает Андрей, Technical Director в студии, разрабатывающей AAA-экшены. — Нужно уметь читать историю кадра. Где именно произошла задержка? Was it a draw call storm? A shader complexity peak? A costly Niagara tick? Без точного понимания точки сбоя любые оптимизации — стрельба из пушки по воробьям».
Эксперты сходятся во мнении, что львиная доля проблем начинается на этапе контента и его импорта. «Мы внедрили жесткий чек-лист для художников, — рассказывает Ольга, Lead Tech Artist. — Все статик-меши должны быть проверены на количество материалов и UV-разверток. Один объект с 15 материалальными слоями — это убийца производительности. Мы используем автоматизированные скрипты на Python, которые проверяют ассеты еще до загрузки в движок и отбраковывают те, что не соответствуют полигональному бюджету или имеют разбитые UV».
Отдельная большая тема — динамическое освещение и тени. «Многие по привычке используют Dynamic Lights для всего подряд. Но в реальности 80% освещения в финальной сцене можно и нужно запекать в Lightmaps. Мы перешли на смешанный подход: ключевые, игровые объекты — dynamic, окружение и статика — fully baked. Это дало прирост в 30-40% на сложных сценах», — делится опытом Сергей, Engine Programmer. Еще один секрет — использование Distance Field Shadows вместо классических Dynamic Shadows для удаленных или не критичных объектов. Они менее точные, но в разы дешевле для рендера.
Оптимизация голубых принтов (Blueprints) — это священная война. «Blueprint — это магия для дизайнеров, но ад для производительности, если использовать его бездумно, — говорит Андрей. — Наши правила: 1) Никаких тяжелых вычислений или циклов по массивам в Tick. Всё, что можно, переносим в асинхронные ноды или на C++. 2) Используем Event Dispatchers вместо постоянных проверок Cast to или Line Traces. 3) Жестко контролируем создание и уничтожение акторов через object pooling, особенно для пуль, эффектов и мусора». Тимлид одной из VR-студий добавляет: «Мы заставляем всех программистов проходить профайлинг своих BP. Когда они видят, что их «удобная» проверка каждые 0.1 секунды съедает 2 мс фреймтайма, подход меняется кардинально».
Работа с уровнем (Level Streaming) и окклюзией (Occlusion Culling). «Unreal умеет хорошо скрывать невидимое, но только если ему помочь. Правильно расставленные Occlusion Volumes и Precomputed Visibility Volumes — это must-have для любого интерьера или города. Мы строим карты окклюзии для ключевых локаций на этапе блокаута. А Level Streaming настраиваем не только по географическому принципу, но и по «весу» контента. Например, высокодетализированная комната загружается отдельно от коридора с низкополигональными стенами», — объясняет Леонид, Lead Level Designer.
Секреты работы с рендер-тредом. «Часто забывают про оптимизацию пост-процессинга, — отмечает Сергей. — Screen Space Reflections (SSR) и Ambient Occlusion (SSAO) могут быть очень дорогими. Мы тонко настраиваем их качество и часто используем более легкие кастомные шейдеры или частично заменяем SSR на планарные рефлекшены. И еще один лайфхак: принудительное ограничение количества skeletal meshes, обновляющихся в кадре, через LOD-систему и агрегацию анимаций».
Кульминацией экспертного подхода является культура данных. «У нас есть дашборд в Grafana, который в реальном времени показывает ключевые метрики производительности на тестовых стендах: время рендера кадра, количество draw calls, потребление памяти пулом текстур, — рассказывает Андрей. — Любое изменение контента или кода, которое выводит метрики за установленные лимиты, автоматически флажится и требует ревью. Производительность — это не разовая акция перед релизом. Это непрерывный процесс, встроенный в пайплайн разработки».
Итоговый совет от всех экспертов: не существует одной волшебной кнопки. Выигрыш в 60 FPS складывается из сотни мелких улучшений по 0.5 мс каждое. Дисциплина контента, грамотное использование инструментов движка, переход критичных вычислений на C++ и постоянный профайлинг — вот четыре столпа высокой производительности в Unreal Engine.
Разгоняем Unreal Engine: секреты производительности от ведущих технических директоров и тимлидов
Глубокое руководство по оптимизации производительности в Unreal Engine от опытных технических директоров и тимлидов. Раскрываются секреты профайлинга, оптимизации контента, освещения, Blueprints, управления уровнем и рендер-тредом. Делается акцент на внедрение культуры производительности в процесс разработки.
137
5
Комментарии (13)