**Set Pass Calls** — это счётчик, показывающий, сколько раз за кадр рендер-пайплайн Unity переключает [[Shader Pass|shader pass]] и заново настраивать рендер-состояние перед тем, как отрисовать группу объектов. ### Почему возникает переключение Когда следующий объект требует **другого варианта шейдера** ([[Shader Variant|shader variant]]) или иного набора настроек _render state_ (Blend, Z-Test, Cull и т. д.), Unity должна выполнить команду `SetPass()`, чтобы загрузить соответствующий GPU-пакет констант и настроек. ### Почему это важно для производительности - **CPU:** каждая команда `SetPass()` генерирует работу для драйвера GPU; при тысячах вызовов растут расходы на запись команд и API-овер-хед. - **GPU:** переключение шейдерных программ обрывает билдинг внутреннего «мега-батча» и очищает кэши, что увеличивает _pipeline bubbles_ и снижает конвейерную эффективность. - Поэтому уменьшение SetPass Calls часто даёт больший выигрыш, чем чистое сокращение _draw calls_, особенно на мобильных GPU. [[Насколько ресурсоёмкой является операция вызова SetPass на GPU?]] ### Способы сократить счётчик 1. **Переиспользовать один .mat-файл** там, где свойства материалов совпадают бит-в-бит. 2. **SRP Batcher / GPU Resident Drawer**: кэшируют константные буферы и сводят одинаковые variants в один вызов SetPass. 3. [[MaterialPropertyBlock]]: Меняет свойства _без_ создания уникального материала, поэтому объекты всё ещё «видят» общий `.mat` и остаются в предыдущих группировках. 4. Объединять текстуры и параметры (texture atlasing, array textures) — меньше материалов ⇒ меньше вариантов. - Как интерпретировать цифру - 1–10 SetPass Calls на кадр — почти идеал. - 100–500 — нормально для средней сцены. - > 1000 — сигнал, что материалы или keywords раздуты и стоит оптимизировать. 3. **SetPass Calls** Unity группирует рендер-команды по (shader variant + render-state). Если материалы отличаются только числовыми свойствами (`float`, текстуры) — SetPass не растёт; если же отличаются ключевые слова — каждой группе нужен свой вариант, а значит отдельный SetPass. - Количество `.mat`-файлов не влияет само по себе. Документация SRP Batcher прямо говорит: «Вы можете использовать **сколько угодно материалов с одним и тем же шейдер-вариантом**» [Unity](https://docs.unity3d.com/2022.3/Documentation/Manual/SRPBatcher.html) - В Unity именно **SRP Batcher** сортирует вызовы Draw по пакету «shader variant + render-state» и выполняет их одним SetPass. Если меняются только числовые свойства материала (текстуры, float-поля), а ключевые слова (`#pragma _FOO_ON` и т. п.) остаются теми же, то SRP Batcher просто подменяет указатель на постоянный буфер и счётчик SetPass не растёт. Как только включается другой набор ключей — компилируется другой shader variant, формируется новое **Pipeline State** → появляется новый SetPass.