**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.