11/10/2021

Оптимизация через уменьшение DrawCalls в материалах

Оптимизация через уменьшение DrawCalls в материалах

Есть множество способов снизить количество DrawCalls в Unreal Engine. В данной статье Владимир Ханин рассказывает про один из таких способов — “Custom primitive data”.

При использовании CPD (Custom primitive data) в материале используется хранение индекса, к которому есть доступ из кода или принтов. Функция очень похожа с изменением скалярных и векторных параметров динамических материалов. Главное отличие —  CPD хранит информацию в самом примитиве, а не в инстансе материала, количество DrawCalls становится в разы меньше, тем самым оптимизируя проект.

Подробнее — в официальной документации.

Итак, на пустой сцене у нас — 7 DrawCalls:

Рассмотрим на примерах влияние CPD и динамических материалов на производительность.

Классическое применение параметров материалов

Создадим материал векторным параметром, отвечающим за цвет:

Создадим простой актор, с одним статик мешем и добавим принт, меняющий цвет на констракте. Имя параметра в ноде должно быть таким же, как название ноды в материале:

Разместив на уровне 30 кубиков, мы увидим, что количество DrawCalls увеличилось до 41:

Создание параметра при помощи CPD

Создадим точно такой же материал, но с установленной галочкой “Use Custom primitive Data”:

В BP акторе добавим ноду “Set Custom Primitive Data Vector4”. Важно заметить, что DataIndex в ноде должен быть установлен точно такой же, как и в Primitive Data Index в материале. Отвечающий за прозрачность ValueW ставим в единицу.

Размещаем точно так же 30 кубиков на сцене. Количество DrawCalls уменьшилось почти в 3 раза – с 41 до 12.

Можно сделать вывод, что CPD почти в половину срезает количество DrawCalls, по сравнению с динамическими изменениями материалов, тем самым повышая производительность приложения.

Важно — "Custom primitive data" уменьшит DC только, если включен автоматический инстансинг. В случае ручного инстансинга и если нужно разнообразить меши, можно использовать "Per Instance Custom Data".

Один из ключевых недостатков этого способа — нет возможности изменять данный параметр в инстансе материала. И по дефолту такой параметр будет равняться 0.

Второй минус вытекает из первого. Изменять параметр нужно в Runtime, так как при изменении на Construction Script параметр при запущенном приложении не изменится, и мы получим черную модель (если меняем материал). Хотя для Scalar Primitive data parameter в настройке модели (Rendering) можно указать дефолтное значение для определенного индекса.

Недавние статьи

80 Level Job Digest: Open Positions for Experienced Artists

06/06/2022
Подборка уникальных вакансий от 80.lv за первую неделю июня. Вакансии от Bohemia Interactive, Firesprite, Platige Image и не только!

С раскосыми и жадными очами!

06/06/2022
Soul of Saka — экшен с элементами приключения и выживания про паренька из кочевого племени сака, ищущего потерянную душу.

Quiet Farm: "Я тебя забодаю!"

30/05/2022
Разработчик "симулятора коровы" рассказывает про крафт через пищеварение, референсы и реалистичную грязь.