Пакетизатор Scriptable Render Pipeline (SRP) — это оптимизация вызовов отрисовки, которая значительно повышает производительность приложений, использующих SRP. SRP Batcher сокращает время ЦП, которое требуется Unity для подготовки и отправки вызовов отрисовки для материалов, использующих один и тот же шейдерПрограмма, работающая на графический процессор. Подробнее
См. в варианте Словарь.
Требования и совместимость
В этом разделе содержится информация о совместимости конвейера рендеринга SRP Batcher.
Совместимость конвейера рендеринга
Характерная черта | Встроенный конвейер рендеринга | Универсальный конвейер рендеринга (URP) | Конвейер рендеринга высокого разрешения (HDRP) | Пользовательский скриптовый конвейер рендеринга (SRP) |
---|---|---|---|---|
SRP Batcher | Нет | Да | Да | Да |
Совместимость с игровыми объектами
В любой заданной сценесцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь некоторые GameObjectsОсновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь совместимы с SRP Batcher, а некоторые нет. Совместимые игровые объекты используют путь кода SRP Batcher, а несовместимые игровые объекты используют стандартный путь кода SRP. Дополнительную информацию см. в разделе Как работает дозатор SRP.
Игровой объект должен соответствовать следующим требованиям, чтобы быть совместимым с путем кода SRP Batcher:
- GameObject должен содержать либо meshосновной графический примитив Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
См. в Словаре или сетке со скинами. Это не может быть частица. - Игровой объект не должен использовать MaterialPropertyBlock.
- Шейдер, который использует GameObject, должен быть совместим с SRP Batcher. Дополнительную информацию см. в разделе Совместимость с шейдерами.
Совместимость с шейдерами
Все освещенные и неосвещенные шейдеры в конвейере рендеринга высокого разрешения (HDRP) и универсальном конвейере рендеринга (URP) соответствуют этому требованию (за исключением версий этих шейдеров с частицами).
Чтобы пользовательский шейдер был совместим с SRP Batcher, он должен соответствовать следующим требованиям:
- Шейдер должен объявить все встроенные свойства движка в одном буфере констант с именем
UnityPerDraw
. Например,unity_ObjectToWorld
илиunity_SHAr
. - Шейдер должен объявить все свойства материала в одном буфере констант с именем
UnityPerMaterial
.
Вы можете проверить статус совместимости шейдера в Инспектореокне Unity, в котором отображается информация о выбранном в данный момент GameObject, настройки актива или проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
См. на панели Словарь.
Использование дозатора SRP
В этом разделе содержится информация о том, как использовать SRP Batcher в готовых конвейерах рендеринга Unity с поддержкой сценариев.
Использование дозатора SRP в URP
Чтобы активировать дозатор SRP в URP:
- В окне проектаокне, в котором отображается содержимое ваших
активов
папка (вкладка «Проект») Подробнее
Посмотрите в Словарь, выберите ресурс URP. - В Инспекторе ресурса URP перейдите в раздел Дополнительно и включите Пакетировщик SRP.
Использование дозатора SRP в HDRP
При использовании HDRP Unity по умолчанию включает пакетировщик SRP. Отключение дозатора SRP не рекомендуется. Однако вы можете временно отключить SRP Batcher в целях отладки.
Чтобы включить и отключить пакетировщик SRP во время сборки с помощью редактора:
- В окне "Проект" выберите HDRP-ресурс.
- В инспекторе актива перейдите в режим отладки. В режиме отладки можно просмотреть свойства объекта HDRP, в том числе свойство SRP Batcher.
- Выберите Включить SRP Batcher, чтобы включить или отключить SRP Batcher.
Чтобы включить или отключить пакетировщик SRP во время выполнения, переключите следующую глобальную переменную в коде C#:
GraphicsSettings.useScriptableRenderPipelineBatching = true;
Как работает дозатор SRP
Традиционный способ оптимизации вызовов отрисовки — уменьшить их количество. Вместо этого SRP Batcher уменьшает изменения состояния рендеринга между вызовами отрисовки. Для этого пакетировщик SRP объединяет последовательность команд графического процессора bind
и draw
. Каждая последовательность команд называется пакетом SRP.
Для достижения оптимальной производительности при рендерингепроцессе вывода графики на экран (или в текстуру рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в Словарь, каждая партия SRP должна содержать столько bind
и draw
. Для этого используйте как можно меньше вариантов шейдера. Вы по-прежнему можете использовать столько разных материалов с одним и тем же шейдером, сколько захотите.
Когда Unity обнаруживает новый материал во время цикла рендеринга, центральный процессор собирает все свойства и привязывает их к графическому процессору в постоянных буферах. Количество буферов графического процессора зависит от того, как шейдер объявляет свои константные буферы.
SRP Batcher — это низкоуровневый цикл рендеринга, который сохраняет данные материалов в памяти графического процессора. Если содержимое материала не меняется, SRP Batcher не вносит никаких изменений в состояние рендеринга. Вместо этого SRP Batcher использует выделенный путь кода для обновления свойств Unity Engine в большом буфере графического процессора, например:
Здесь ЦП обрабатывает только свойства Unity Engine, помеченные как Большой буфер для каждого объекта на приведенной выше диаграмме. Все материалы имеют постоянные постоянные буферы, расположенные в памяти графического процессора, которые готовы к использованию. Это ускоряет рендеринг, потому что:
- Все материалы теперь сохраняются в памяти графического процессора.
- Выделенный код управляет большим буфером констант графического процессора для каждого объекта для всех свойств объекта.
Намеренное удаление совместимости SRP Batcher для GameObjects
В некоторых редких случаях может потребоваться намеренно сделать определенные игровые объекты несовместимыми с пакетировщиком SRP. Например, если вы хотите использовать инстансирование GPU, которое несовместимо с SRP Batcher. Если вы хотите визуализировать множество идентичных мешей с одним и тем же материалом, создание экземпляров GPU может быть более эффективным, чем SRP Batcher. Чтобы использовать экземпляр GPU, вы должны:
- Используйте Graphics.DrawMeshInstanced.
- Вручную удалите совместимость с SRP Batcher и включите создание экземпляров GPU для материала.
Существует два способа удалить совместимость с SRP Batcher из GameObject:
- Сделайте шейдер несовместимым.
- Сделайте средство визуализации несовместимым.
Совет. Если вы используете создание экземпляров GPU вместо дозатора SRP, используйте ProfilerОкно, которое поможет вам оптимизировать игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Подробнее
См. Словарь, чтобы убедиться, что создание экземпляров GPU более эффективно для вашего приложения, чем дозатор SRP.
Удаление совместимости с шейдерами
Вы можете сделать как написанные от руки, так и шейдеры Shader Graph несовместимыми с SRP Batcher. Однако для шейдеров Shader Graph, если вы часто изменяете и перекомпилируете Shader Graph, проще вместо этого сделать средство визуализации несовместимым.
Чтобы сделать шейдер Unity несовместимым с SRP Batcher, необходимо внести изменения в исходный файл шейдера:
- Для рукописных шейдеров откройте исходный файл шейдера. Для шейдеров Shader Graph скопируйте скомпилированный исходный код шейдера Shader Graph в новый исходный файл шейдера. Используйте новый исходный файл шейдера в своем приложении вместо Shader Graph.
- Добавьте новое объявление материального свойства в блок
Properties
шейдера. Не объявляйте новое свойство материала в буфере константUnityPerMaterial
.
От материальной собственности ничего не требуется; наличие свойства материала, которого нет в буфере констант UnityPerMaterial
, делает шейдер несовместимым с SRP Batcher.
Предупреждение. Если вы используете диаграмму шейдеров, имейте в виду, что каждый раз, когда вы редактируете и перекомпилируете диаграмму шейдеров, вы должны повторять этот процесс.
Удаление совместимости средства визуализации
Вы можете сделать отдельные модули рендеринга несовместимыми с SRP Batcher. Для этого добавьте в средство визуализации MaterialPropertyBlock
.
Профилирование дозатора SRP в отладчике Unity Frame
Вы можете проверить статус пакетов SRP в окне Frame Debugger. Каждый пакет SRP показывает, сколько вызовов отрисовки использовала Unity, какие ключевые слова Unity привязала к шейдеру, а также причину, по которой Unity не объединила этот вызов отрисовки с предыдущим.
Чтобы проверить статус пакетов SRP Batcher:
- В редакторе откройте отладчик фреймов (меню: Окно > Анализ > Отладчик фреймов).
- В отладчике кадров выберите Визуализация камеры > Визуализация непрозрачности.
- Разверните список RenderLoopNewBatcher.Draw.
- Выберите пакет SRP, который хотите проверить.
В приведенном ниже примере причина в том, что узлы имеют разные шейдеры. Это означает, что шейдер для этого пакета SRP отличается от шейдера в предыдущем пакете SRP. Поскольку SRP Batcher использовал другой шейдер, SRP Batcher создал новый пакет. Если несколько пакетов SRP имеют небольшое количество вызовов отрисовки, это часто означает, что проект использует слишком много вариантов шейдера.
Если вы пишете собственный конвейер рендеринга с поддержкой сценариев, вместо использования универсального конвейера рендеринга или конвейера рендеринга высокого разрешения попробуйте написать универсальный многоцелевой шейдер с минимальным количеством ключевых слов. Это оптимально, потому что вы можете использовать столько свойств материалов, сколько хотите.