Очерк об оптимизации в UE5

Щитпост-сборник различных способов оптимизации ваших Unreal-поделок.

Очерк об оптимизации в UE5

TL;DR

  1. LOD'ы
  2. Текстуры через Tools > Audit > Statistics
  3. Lightmass вместо Lumen
  4. Профайлер
  5. Визуализаторы в Lit > Optimization Viewmodes

ВАЖНОЕ ЗАМЕЧАНИЕ: на данный момент я не являюсь Unreal-разрабом. Начну учить Анрыл, ориентировочно, в следующем году.

Но уже сейчас меня распирает от идей. Надо воспроизвести функционал Source на Unreal 5, создать сиквел к Bella Bittersweet, и начать разработку полноценного проекта.

В чем суть данного поста?

На данный момент у Анрыла плохая репутация по части оптимизации. Игры выходят мыльными,

Immortals of Aveum на Series S
Immortals of Aveum на Series S

со статерами,

Callisto Protocol создавался на Unreal 4, но суть та же.

и просто плохо оптимизированными.

SH2R рендерит всю локацию, даже если она скрыта за туманом.

Из своего опыта взаимодействия с Source Engine могу сказать, что разработчикам следует заранее планировать свою работу так, чтобы ваш игро-содержащий продукт использовал строго определенное количество ресурсов + отдельно потратить время на оптимизацию (люксели, area_portals, vis distance, если мы говорим о Source).

Насколько я понимаю, современным разрабам и издателям абсолютно плевать на оптимизацию. Хуяк-хуяк и в продакшн, а если кто-то будет ныть:

"Мы оптимизировали ее, но вам, возможно, придется обновить свой компьютер".

Тодд "говнарь" Говард про тех. состояние Starfield

Из того, что я посмотрел, в Анрылыче есть все, что только можно представить, чтобы игра летала: все виды каллингов, различные условия по удалению объектов со сцены (размер, расстояние, тип и тд.), профайлер, аналог порталов и skip/hint из Source, запекание теней.
В общем движок, по всей видимости, не особо виноват.

Дело в том, что буржуазная цивилизация закрывает трудящемуся большинству доступ в высшие этажи развития человеческой психики, поскольку обрекает это большинство на пожизненную работу ради куска хлеба, ради крыши над головой, ради грубо примитивных или гипертрофированных, извращенных этой цивилизацией требований плоти. А такой тип мотивации никогда не рождал и не родит таланта.

Учитесь Мыслить Смолоду. Ильенков Эвальд Васильевич

Чтобы мою игру заметили, я хочу сразу же решить как можно больше технических проблем и показать, что на Анрыле таки можно создавать вполне себе годно оптимизированную шнягу.

Ну а у всех остальных отныне будет компендиум по оптимизации.

- Откуда взял информацию?
- Собрал из разных YT видео по теме.

И еще одно ВАЖНОЕ ЗАМЕЧАНИЕ: в данном посте я не буду рассматривать оптимизацию кода, шейдеров, блюпринтов и тд. так как я не въезжаю в эти темы от слова совсем.

******************************************************************************

Оптимизация по умолчанию

Сначала рассмотрим то, что и так работает.

Пример из Horizon Zero Dawn (Decima Engine)

Все, что не находится в усеченном конусе (за пределами видимости игрока) не будет рендерится.

Occlusion Culling

Убирает объекты, если они перекрыты другими объектами

Если вам необходимо держать объект в памяти даже несмотря на то, что его уже не видно,

выделите объект -> Rendering -> Bounds Scale -> увеличьте число

******************************************************************************

LOD

Несмотря на наниты, вы все равно должны думать о LOD'ах.

Выбираем проп -> LOD settings -> выбираем подходящий LOD group -> Number of LODs -> Apply Changes

Для того, чтобы контролировать дистанцию, на которой один LOD будет переключаться на другой,

LOD picker - нажимаем на кнопку Custom -> LOD Settings - отключаем auto compute LOD distances -> в поле Screen Size вбиваем нужные цифры

В LOD Picker можно выбрать нужный LOD и выбрать необходимый процент полигонов от LOD 0 с помощью Percent Triangles

Если между LOD'ами нет разницы - удалите один из них.

******************************************************************************

Можно сделать так, чтобы объект исчезал, когда мы отдаляемся от него на определенное расстояние.

Выбираем объект -> Desired Max Draw Distance

Для лампочек ищем 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

******************************************************************************

ТЕКСТУРЫ

​Выделяете текстуру > Asset Actions > Edit Selection > Maximum Texture Size

Optimization Viewmodes

В Unreal есть множество способов визуально посмотреть на загруженность сцены

В окне редактора нажимаем​ Lit > Optimization Viewmodes

Очень много проблем будет с Lightmap Density.

Выбираем красный объект > Override Lightmap Resolution

******************************************************************************

В Unreal есть некоторое подобие ареа-порталов из Сурса

  1. Window > Levels
  2. Level > Create New (Streaming Level)
  3. Создаем Level Streaming Volume
  4. Выбираем Streaming Level > Summons Level Detail
  5. Создаем новый Streaming Volume и подключаем нужный Level Streaming Volume

******************************************************************************

МЕЛОЧЬ

MisterPepsa также добавил:

Я прочитал, забыл в оптимизацию добавить HISM и ISM ,еще обьединение группу обьектов в 1 для уменьшение вызовов отрисовки (я забыл как оно называется погугли, PLA вроде) .текстуры скорее всего надо обьединять в атласы , для текстур еще используется mipmap , написано отключать нанит и люмен но не написано про вирутал шедов мапс , обьекты не должны перекрывать друг друга (типо мигает то один то другой ) это влияет сильно на перерисовку

Я также решил пересмотреть Digital Foundry за этот год и составить список всех огрехов, встречающихся в современных UE тайтлах.

  • Прекомпилируй шейдеры
  • Загрузка новой территории всегда стопорится
  • Работайте с 8-ю гигами VRAM
  • Тени и LOD, особенно в лесах
  • Текстуры не прогружаются
  • Разрешение
  • Волосы надо переделывать с нуля
  • screen-space отражения надо переделать
  • Мерцания
  • динамическое разрешение может вызвать задержки
  • Бюджет на сцену
Я буду этим чуваком
6
14 комментариев