Получение результатов в оптимизации VFX в Unreal Engine 4

0
79
Карты Изогнутой Нормали в Unreal Engine 4

Основные системы в Cascade – GPU / Game Thread / Render Thread

Cascade создает надежные системы частиц, которые динамически распространены в трех основных системах движка в UE4, – Game Thread, Render Thread и GPU.

  • Время моделирования частиц (Tick) рассчитывается в Game Thread.
  • Фильтрация данных о частицах (Геометрия упаковки, Обратные вызовы) рассчитываются в Render Thread.
  • Изображения частиц (сложность Шейдера, перегрузка) вычисляются в GPU.

Все эти системы вычисляются параллельно друг другу, поэтому замедление в любой отдельной системе может означать узкие места в процессе рендеринга, что соответствует низкой частоте кадров. При создании систем частиц в Cascade важно учитывать все 3 процесса.

Также важно отметить, что Cascade запускает оценку частиц в Game Thread (игровой теме), которая является одним и тем же вычислением местоположения геймплея.

Перерасход – GPU

Когда вы добавляете Материал на поверхность спрайта, этот Материал имеет стоимость в подсчете инструкций. Для полупрозрачных объектов эта стоимость инструкции складывается, когда уровень прозрачности складывается вверх, создавая переупаковку. Чем больше слоев полупрозрачности, тем выше стоимость. В простейшей форме переопределение может быть описано как:

Overdraw = Pixel shader cost = Number of layers * avg number of pixels affected by a layer * avg number of instructions for a layer

Вы можете легко увидеть эту стоимость в режиме Shader Complexity Mode. Алый = 300 инструкций, розовый = 600 инструкций и белый> = 900 инструкций. Нажмите Alt + 8, чтобы просмотреть сложность шейдеров на ПК.

Количество команд для Материала можно увидеть в Редакторе Материалов.

Сложность шейдера дает приблизительную оценку стоимости системы; однако он также зависит от сцены, поскольку полупрозрачность вычисляется по непрозрачным объектам, которые также имеют стоимость.

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

Некоторые шаги, которые можно предпринять, чтобы контролировать удаление, следующие:

  • Снизить уровень уменьшения.
  • Сократите количество инструкций по материалам.
  • Уменьшите масштаб частиц (заполните меньше экрана).
  • Создайте LOD для снижения близких/дальних частиц, чтобы снизить стоимость на разных расстояниях для зрения.
  • Проверьте, что эмиттеры помещены в линию, укладывающиеся друг напротив друга (статические помещенные эффекты).

LODs – Уровень детализации – GPU / Game Thread

LODs в Cascade предоставляют пользователям возможность контролировать модули и поведение на основе расстояния от игрока до эмиттера. Любой атрибут в системе частиц может быть изменен для использования системы LOD.

Дополнительную техническую информацию о настройке LOD читайте в разделе Particle System Level of Detail (LOD) раздела Справочника по Cascade.

Важно иметь в виду при создании LODs, есть затраты на память, связанные с не распределенными модулями. Совместное использование как можно большего количества модулей по LODs уменьшает объем памяти. Создавайте уникальные настройки модуля для атрибутов, которые вы хотите изменить.настройки модуля для атрибутов ue4

Режимы предварительного просмотра в представлении Cascade и в редакторе выглядят по-разному. Чтобы получить правильный просмотр в Cascade, установите для параметра View -> Detail Mode значение High.

Cascade позволяет переключаться между LODs и отображает указанный LOD. Обязательно отключите режим просмотра Editor LOD, чтобы правильно видеть обновление Cascade.

Включение предварительного просмотра редактора предоставляет возможность пролетать через сцену и видеть, как системы частиц переключаются между LODs при движении.

Важно измерить сцену и получить реалистичное представление о том, сколько единиц необходимо для просмотра эффектов в правильном состоянии. В случае систем окружающих частиц можно испускать 0,00 частицы и уменьшать время (tick time), когда системы частиц могут быть не видны. Измерение расстояния можно выполнить, удерживая среднюю кнопку мышки и перетаскивая любой орфографический вид (спереди, сбоку, сверху).

LOD Distance Check Time

Функция LOD Distance Check Time определяет, как часто игра проверяет расстояние игрока до эмиттера, размещенного в сцене, чтобы определить, какой LOD использовать. LOD Distance Check Time работает, когда LOD Method установлен на automatic.

Установка на Automatic существенно позволяет игре определять LOD во время игры. Если вы увеличите время проверки LOD Distance, количество времени между проверками увеличится. LOD DistanceCheckTime рассчитывается в секундах, поэтому при настройке учитывайте максимальную скорость движения вашего игрока. Если вы установите LOD Distance Check Time на значение 0.00, расстояние проверяется каждым кадром, что может привести к снижению производительности.

LOD Method – Game Thread

Правильная установка LOD Method может быть жизненно важной для производительности и визуальных эффектов.

Automatic – игра установит LOD на основе параметров расстояния, определенных в эффекте, используя настройки времени задержки LOD. Обычно используется для окружающих эффектов, которые делают петли и не вызываются игровым кодом.

Direct Set – LOD определяется (как правило, игровым кодом), когда эффект порождается и остается на заданном LOD. Обычно используется во взрывных эффектах, таких как взрывы или удары.

Activate Automatic – LOD определяется, когда эффект порождается, исходя из параметров расстояния, определенных в LOD. Обычно используется во всплывающих эффектах, называемых Blueprints и т.д., которые требуют, чтобы LODs никогда не менялись после появления.

Фиксированные против нефиксированных границ – Game Thread

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

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

Есть несколько соображений для фиксированных и нефиксированных границ, которые следует иметь в виду.

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

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

Draw Calls – Render Thread

Draw calls (обратные вызовы) в системах частиц может быть сложно отслеживать время от времени. При определении затрат на привлечение обратных вызовов необходимо учитывать несколько комбинированных факторов.

Излучение частиц Sprite – это 1 draw call на эмиттер, независимо от ориентации экрана.

Эмиссия меши – это 1 draw call на каждый эмиттер, независимо от количества выведенных мешей. Тем не менее, на мобильных устройствах стоимость составляет 1 draw call на выведение меши. Итак, на мобильном устройстве, если у вас есть 2 эмиттера, каждый из которых излучает 10 мешей, у вас есть общая стоимость 20 draw calls, связанных с этой системой частиц.

Передачи Материала также определяют затраты на привлечение draw calls. Чем больше проходит в вашем Материале, тем больше draw calls к вашему эффекту.

Например:

  • Система частиц А состоит из: 1 эмиттера, воспроизводящий 12 спрайтов, использующий Материал с 1 Передачей, вся система стоит 1 draw call.
  • Система частиц B состоит из: 1 эмиттера, воспроизвдящий 12 спрайтов, использующий Материал с 2 Передачами, вся система стоит 2 draw calls.
  • Система частиц C состоит из: 1 эмиттера, воспроизводящий 12 мешей, с использованием Материала с 2 Передачами
    • На мобильных платформах: вся система стоит 24 draw calls. (2 передачи за вызов X 12 мешей, так как каждая меш представляет собой один draw call = 24 draw calls).
    • На всех других платформах: вся система стоит 2 draw calls.
  • Система частиц D состоит из: 1 эмиттера, воспроизводящий 6 мешей, с использованием Материала с 2 Передачами и 1 эмиттера, который воспроизводит 10 спрайтов с 1 Передачей, и вся система стоит 13 draw calls. (2 передачи на draw call X 6 мешей, так как каждая меш представляет собой одиночный draw call = 12 draw calls, 1 передача X 10 спрайтов = 1 draw call).

Атрибуты Материалов, которые вносят вклад, включают:

Прозрачный Материал = основа 1 передачи

  • +2 для искажения
  • +1 для bUseLitTranslucencyDepthPass
  • +1 для bUseLitTranslucencyPostRenderDepthPass
  • +2 для bUsedWithFogVolumes

Непрозрачный / замаскированный Материал = основа 2 передач

Draw calls для конкретной сцены можно просмотреть с помощью команды DumpParticleFrameRenderingStats. Эта команда выводит электронную таблицу, которая подробно описывает затраты на draw calls.

Воздействие от draw calls увеличивается пропорционально количеству отображаемых представлений. Это означает, что в режиме разделения экрана эффекты умножаются. Смотрите страницу Оптимизация VFX: SplitScreen для получения более подробной информации об оптимизации эффектов для разделенного экрана.

Важно учитывать эти затраты при построении ваших эффектов и при оптимизации эффектов. Если поток рендеринга высок из-за draw calls, а среда находится в пределах бюджета, это место для начала поиска.

Mesh Emission – Game Thread / Render Thread

Эмиссия Меши является одной из наиболее мощных функций Cascade. Это функция, которой можно случайно злоупотребить на мобильных устройствах, поскольку уровень эмиссии соответствует количеству draw calls. Кроме того, также неплохо иметь рассчеты вершин на ваших мешах низкими.

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

CPU Collisions – Game Thread

Как правило, существует высокая стоимость, связанная с выполнением столкновения частиц ЦП в Unreal Engine 4, поэтому их следует использовать только тогда, когда это необходимо.

Для минимизации затрат на столкновение можно использовать несколько настроек:

  • MaxCollisions: держите это значение как можно ниже.
  • Опция Collision Completion: установите для этого значение HaltCollisions/Freeze, чтобы остановить выполнение коллизионных проверок против сцены после достижения MaxCollisions.
  • Damping Factor определяет отскок объектов после столкновения, более низкие значения могут привести к тому, что объекты будут быстрее опираться (меньшее значение Max Collisions).

Spawn Per Unit – GPU/Game Thread

Spawn Per Unit – это функция в Cascade, которая полезна для заполнения пробелов при движении систем частиц. Хотя эта функция удобна для создания великолепных траекторий частиц, важно сбалансировать визуальные эффекты с ограничениями производительности при использовании Spawn Per Unit.

Существует несколько трюков для контроля эмиссии:

  • Держите юнит Scalar на максимально возможном значении и балансируйте его с уровнем эмиссии, чтобы получить необходимую вам наполнимость, при этом эффект слишком тяжелый.
  • Попытайтесь использовать нижестоящие подсчеты материалов, если вы знаете, что у вас будет высокий уровень эмиссии, используя Spawn Per Unit.
  • Отрегулируйте максимальное расстояние кадра, чтобы ограничить количество частиц. Если эмиттер идет выше этого, Max Frame Distance Spawn на единицу прекратит эмиссию, пока оно не станет ниже расстояния. Это не позволяет эмиттеру сбрасывать большое количество спрайтов в сцену.

Расходы памяти

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

Распределение частиц определяет, сколько частиц возможно, чтобы эмиттер размещался в мире в любой момент времени, это играет большую роль в определении того, сколько памяти будет потреблять ваша система частиц. Вы можете увидеть оценку памяти, включив оверлей памяти частиц в раскрывающемся меню View в Cascade.

Регулируя настройки, можно увидеть увеличение и уменьшение стоимости памяти.

Несколько способов уменьшить объем памяти:

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

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

Более недавнее добавление к Cooker оценивает все модули в системе частиц и определяет идентичные модули, а затем разделяет модули для автоматического уменьшения объема памяти во время приготовления.

Tick Time – Game Thread

Tick ​​Time представляет собой количество времени, затрачиваемого на обновление систем частиц в сцене. Tick ​​Time можно просмотреть командой stat particle, в которой перечислены все относительные данные, необходимые для оценки затрат частиц.

Существует множество методов, которые можно использовать для снижения стоимости Tick.

На время Tick Time прямо влияет количество активных EmitterActors в вашей сцене. Чем активнее эмиттеры в сцене, тем выше будет это время. Эмиттеры должны быть настроены только на autoActivate, если они требуются для цикла при запуске уровня.

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

Параметр Частицы (Particle Parameter) может использоваться в эффекте, позволяющем смещения позиции после того, как эффект будет помещен в мир. Используя параметр частиц, можно уменьшить количество эмиттеров, что в целом снижает стоимость Tick Time. Параметры частиц можно настроить, выбрав particleParameter из списка распределения в модуле для индивидуальной настройки.

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

Системы частиц, загруженные в память, но вне поля зрения (скажем, на полу над вами) также могут быть переключены с помощью действий Blueprint и потоковых вольюмов для снижения затрат на оценку.

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

Количество частиц учитывается непосредственно в стоимости оценки. Чем больше частиц в сцене, и чем дольше они живут, тем больше требуется оценка. Ограничение продолжительности жизни до требуемого эффекта – хорошая практика.

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

Проверьте свои эффекты на дорогостоящие затраты на оценку, которые можно снизить, например, столкновения, фиксированные границы и воспроизводить на единицу, которые слишком высоки. Установка границ в фиксированное состояние может значительно повысить производительность и должна использоваться по возможности.

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите свой комментарий!
Пожалуйста, введите ваше имя: