Очерк об оптимизации в UE5
Щитпост-сборник различных способов оптимизации ваших Unreal-поделок.
TL;DR
- LOD'ы
- Текстуры через Tools > Audit > Statistics
- Lightmass вместо Lumen
- Профайлер
- Визуализаторы в Lit > Optimization Viewmodes
ВАЖНОЕ ЗАМЕЧАНИЕ: на данный момент я не являюсь Unreal-разрабом. Начну учить Анрыл, ориентировочно, в следующем году.
Но уже сейчас меня распирает от идей. Надо воспроизвести функционал Source на Unreal 5, создать сиквел к Bella Bittersweet, и начать разработку полноценного проекта.
В чем суть данного поста?
На данный момент у Анрыла плохая репутация по части оптимизации. Игры выходят мыльными,
со статерами,
и просто плохо оптимизированными.
Из своего опыта взаимодействия с Source Engine могу сказать, что разработчикам следует заранее планировать свою работу так, чтобы ваш игро-содержащий продукт использовал строго определенное количество ресурсов + отдельно потратить время на оптимизацию (люксели, area_portals, vis distance, если мы говорим о Source).
Насколько я понимаю, современным разрабам и издателям абсолютно плевать на оптимизацию. Хуяк-хуяк и в продакшн, а если кто-то будет ныть:
"Мы оптимизировали ее, но вам, возможно, придется обновить свой компьютер".
Из того, что я посмотрел, в Анрылыче есть все, что только можно представить, чтобы игра летала: все виды каллингов, различные условия по удалению объектов со сцены (размер, расстояние, тип и тд.), профайлер, аналог порталов и skip/hint из Source, запекание теней.
В общем движок, по всей видимости, не особо виноват.
Дело в том, что буржуазная цивилизация закрывает трудящемуся большинству доступ в высшие этажи развития человеческой психики, поскольку обрекает это большинство на пожизненную работу ради куска хлеба, ради крыши над головой, ради грубо примитивных или гипертрофированных, извращенных этой цивилизацией требований плоти. А такой тип мотивации никогда не рождал и не родит таланта.
Чтобы мою игру заметили, я хочу сразу же решить как можно больше технических проблем и показать, что на Анрыле таки можно создавать вполне себе годно оптимизированную шнягу.
Ну а у всех остальных отныне будет компендиум по оптимизации.
- Откуда взял информацию?
- Собрал из разных YT видео по теме.
И еще одно ВАЖНОЕ ЗАМЕЧАНИЕ: в данном посте я не буду рассматривать оптимизацию кода, шейдеров, блюпринтов и тд. так как я не въезжаю в эти темы от слова совсем.
******************************************************************************
Оптимизация по умолчанию
Сначала рассмотрим то, что и так работает.
Все, что не находится в усеченном конусе (за пределами видимости игрока) не будет рендерится.
Occlusion Culling
Убирает объекты, если они перекрыты другими объектами
Если вам необходимо держать объект в памяти даже несмотря на то, что его уже не видно,
******************************************************************************
LOD
Несмотря на наниты, вы все равно должны думать о LOD'ах.
Для того, чтобы контролировать дистанцию, на которой один LOD будет переключаться на другой,
В LOD Picker можно выбрать нужный LOD и выбрать необходимый процент полигонов от LOD 0 с помощью Percent Triangles
Если между LOD'ами нет разницы - удалите один из них.
******************************************************************************
Можно сделать так, чтобы объект исчезал, когда мы отдаляемся от него на определенное расстояние.
Для лампочек ищем Max Draw Distance
Если у нас множество мешей, то используем актора Cull Distance Volume и затем прописываем необходимые условия.
Ищите cull и distance в опциях, чтобы прописать дистанцию исчезновения объектов.
******************************************************************************
LIGHTMASS
Вместо Lumen можно заранее запечь свет от статических и стационарных источников света и тем самым повысить значительно повысить FPS
1. Откройте вкладку Плагины в меню Редактор > Плагины. В категории Встроенные > Редактор найдите и включите GPU Lightmass.
2. Откройте окно настроек проекта из меню Редактор > Настройки проекта.:
a. В категории "Движок" > "Рендеринг" включите следующее:
- Ray Tracing > Ray Tracing
- Virtual Textures > Enable Virtual Texture Support
- Virtual Textures > Enable Virtual Texture Lightmaps
- Global Illumination > None
b. В категории "Платформы" > "Windows" задайте следующие параметры:
Targeted RHIs > Default RHI: DirectX 12
Перезапускаем и запекаем через Build -> GPU Lightmass
Также не забываем World Setting -> Force No Precompute Lighting и сделать Skylight и AmbientLight статическими.
FPS повысился с 30 до 120.
******************************************************************************
Полезные консольные команды
- stat gpu - статистика по использованию GPU
- stat game
- stat rhi
- profilegpu
Можно выбрать множество ассетов и отредактировать их Cull Distance через Asset Actions > Bulk Edit
******************************************************************************
ТЕКСТУРЫ
Optimization Viewmodes
В Unreal есть множество способов визуально посмотреть на загруженность сцены
Очень много проблем будет с Lightmap Density.
Выбираем красный объект > Override Lightmap Resolution
******************************************************************************
В Unreal есть некоторое подобие ареа-порталов из Сурса
- Window > Levels
- Level > Create New (Streaming Level)
- Создаем Level Streaming Volume
- Выбираем Streaming Level > Summons Level Detail
- Создаем новый Streaming Volume и подключаем нужный Level Streaming Volume
******************************************************************************
МЕЛОЧЬ
- Включение megalights может повысить производительность, если у вас много источников света
- Что насчет Nanite? Если у вас очень тяжелая сцена с миллионами полигонов, то Nanite - это круто. Если количество полигонов не очень большое, то Nanite будет только мешать.
- Проверьте Settings > Engine Scalability Settings
- Погуглите туториалы по оптимизации компиляции шейдеров.
- Зайдите в Modeling Mode > Mesh > Simplifyer Type = UE Standard > прочекайте все ползунки
- Сжимайте текстуры Albedo, ORM и тд., а вот Normal оставляем как есть
- Выберите маленькие объекты и выключите у них тени с помощью Cast Shadow
- Посмотрите и отрегулируйте Dynamic Shadow Distance movable Light, чтобы не просчитывать тени, находящиеся далеко от вас
- Отключаем последние технологии (Lumen, Nanite). Спорное решение, так что проверяйте что лучше подходит для вашего проекта.
- Используйте больше spot light и rect light, так как point light жрет больше всех.
- Можно создать Post Process Volume и задать для него свои параметры освещения, который будет жрать меньше ресурсов
- Можно удалить коллизию на тех объектах, с которыми игрок никак не будет взаимодействовать.
- t.maxfps X - установить FPS в редакторе. 30 достаточно
- Instanced Static Meshes - выберите ассет > правая кнопка мыши > Level > Create Packed Level Actor
- Выделите Blueprint > правая кнопка мыши > Size Map > Memory Size
- Не используйте Event Tick и Cast
- Отключайте тени, движение, физику и тд на определенном расстоянии
- Проверьте коллизии
- Tools > Audit > Statistics
- 60FPS = 16.66ms
MisterPepsa также добавил:
Я прочитал, забыл в оптимизацию добавить HISM и ISM ,еще обьединение группу обьектов в 1 для уменьшение вызовов отрисовки (я забыл как оно называется погугли, PLA вроде) .текстуры скорее всего надо обьединять в атласы , для текстур еще используется mipmap , написано отключать нанит и люмен но не написано про вирутал шедов мапс , обьекты не должны перекрывать друг друга (типо мигает то один то другой ) это влияет сильно на перерисовку
Я также решил пересмотреть Digital Foundry за этот год и составить список всех огрехов, встречающихся в современных UE тайтлах.
- Прекомпилируй шейдеры
- Загрузка новой территории всегда стопорится
- Работайте с 8-ю гигами VRAM
- Тени и LOD, особенно в лесах
- Текстуры не прогружаются
- Разрешение
- Волосы надо переделывать с нуля
- screen-space отражения надо переделать
- Мерцания
- динамическое разрешение может вызвать задержки
- Бюджет на сцену