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

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

WN Belgrade 23 Last Call

05/02/2023
WN Belgrade 23 — уже на следующей неделе! Традиционный промокод на скидку — внутри.

Маленький остров, большие сердца

09/12/2022
Продюсер и брэнд-менеджер игры Tiny Island рассказывают об истории разработки и маркетинге проекта. 

Новая книга о разработке на UE5 и основах Blueprint

17/11/2022
Во-первых, перед нами — пособие по созданию игр и сцен на актуальной версии Unreal Engine 5, во-вторых, это наконец-то не переводная, а отечественная работа.