Как отлаживать материал, который подозревается в просадке производительности рендеринга?
После добавления нового материала на стены кадр стал тяжелее. stat unit показывает, что строка GPU — самая высокая. Вы открываете панель Stats материала и включаете viewmode Shader Complexity, и видите следующее:
stat unit: Frame 22.4 Game 8.1 Draw 4.0 GPU 21.8
Material Stats (непрозрачный материал стен):
Base pass shader: 412 instructions (норма непрозрачного: 100-200)
Texture samplers: 13 / 16
Shader Complexity viewmode: стены светятся ярко-красным/розовым
Определите причину.
Откройте панель статистики материала, чтобы увидеть число инструкций и сэмплеров текстур, затем используйте viewmode Shader Complexity для оценки овердрова и цены на экране. Профилируйте кадр через ProfileGPU, чтобы подтвердить, что виноват base pass.
- ✗Читать
Shader Complexityкак числовызовов отрисовки, а не цену шейдера на пиксель - ✗Игнорировать число инструкций и сэмплеров в панели статистики материала
- ✗Оптимизировать материал до того, как
ProfileGPUподтвердит, что узкое место — base pass
- →Почему полупрозрачный материал ухудшает показания viewmode
Shader Complexity? - →Как перевод узлов в static switch снижает число инструкций материала в рантайме?
Сценарий
Дизайнер уровня сообщает, что после добавления нового материала на стены кадр стал заметно тяжелее. Материал «выглядит обычно», и непонятно, почему он дорогой.
Диагностика
Шаг 1. Подтвердить, что узкое место — GPU. Вводим stat unit. Если строка GPU выше Game и Draw — упор в GPU, и материал — правдоподобный подозреваемый.
Шаг 2. Открыть статистику материала. В редакторе материала включаем панель Stats. Видим тревожные цифры:
Base pass shader: 412 instructions ← очень много
Texture samplers: 13 / 16 ← почти лимит
Норма для типового непрозрачного материала — порядка 100–200 инструкций.
Шаг 3. Включить viewmode Shader Complexity. Стены светятся красным/розовым — это цена шейдера на пиксель, а не число вызовов отрисовки. Красный = дорогой пиксельный шейдер.
Шаг 4. Профилировать кадр. Команда ProfileGPU (или Unreal Insights) показывает, что BasePass вырос на несколько миллисекунд после добавления материала.
Причина
Граф материала содержал множество узлов, вычисляемых на каждый пиксель: несколько слоёв сэмплов текстур, дорогая математика и панорамирование. Эта работа выполняется для каждого закрашенного пикселя, и большие стены покрывают весь экран.
Исправление
- Перенести постоянные вычисления из пиксельной части в вершинную (Customized UVs) или в параметры.
- Заменить ветвления на узлы
Static Switch— неиспользуемые ветки исключаются из скомпилированного шейдера. - Сократить число сэмплов текстур; объединить маски в каналы одной текстуры (packed RGBA).
- Перепроверить статистику: цель — вернуть base pass к ~150 инструкциям.