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) можно указать дефолтное значение для определенного индекса.

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

"Из шажков складываются километры пройденного пути"

11/10/2021
Олег Антипов — один из тех соло инди-разработчиков, кто делает игры в одну каску, лишь изредка прибегая к помощи аутсорсеров.

Что-то пошло не так

22/09/2021
The Mortal Tai — шутер про Россию в недалёком будущем. Зомби и киборги: сразу эдакий киберпанк и постапокалипсис.

От ненависти игроков до фичеринга в Steam

22/09/2021
Автор мокбастеров делится своей стратегией выпуска коротких малобюджетных игр, которая в итоге сыграла ему на руку.