← Назад к вопросам

В чем разница между Draw и SetPass Call?

3.0 Senior🔥 61 комментариев
#Оптимизация#Рендеринг и графика

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Draw Call и SetPass Call в Unity

В оптимизации рендеринга в Unity ключевыми метриками являются Draw Call и SetPass Call. Они описывают разные этапы процесса отрисовки и их понимание критично для эффективной работы с графикой, особенно на мобильных платформах или в проектах с высокой нагрузкой.

Draw Call

Draw Call — это команда, отправленная графическому API (например, OpenGL или Direct3D), которая указывает GPU отрисовать конкретный набор геометрии (меш) с текущими установленными параметрами рендеринга. Это базовая единица работы для GPU.

  • Каждый Draw Call соответствует одному объекту (или группе объектов с одинаковым материалом и состоянием).
  • Высокое количество Draw Calls негативно влияет на производительность, так как каждую команду нужно подготовить и передать на GPU, что создает нагрузку на CPU.
  • Пример: если на сцене 100 отдельных объектов с уникальными материалами, будет примерно 100 Draw Calls.
// Пример: каждый следующий Renderer вызовет новый Draw Call, если материалы разные
public class DrawCallExample : MonoBehaviour
{
    void Update()
    {
        // Рендеринг нескольких объектов с разными материалами
        // Каждый такой вызов в рендерере - это отдельный Draw Call.
        // На практике Unity автоматически их собирает и отправляет.
    }
}

SetPass Call

SetPass Call — это более специфичная для Unity метрика. Она обозначает количество изменений шейдерных пассов (Shader Passes) во время рендеринга. Шейдер может иметь несколько пассов (например, для многопроходного рендеринга, эффектов постобработки или сложных материалов).

  • SetPass Call происходит каждый раз, когда графическому API нужно переключить текущий активный шейдер или его пасс (изменить состояние шейдера, текстуры, параметры).
  • Это изменение состояния рендеринга, которое может быть дороже, чем сам Draw Call, потому требует смены данных в контексте GPU.
  • Если несколько объектов используют одинаковый материал и шейдерный пасс, они могут быть отрисованы с одним SetPass Call, но несколькими Draw Calls (например, при использовании GPU Instancing).
// Шейдер с двумя пассами может увеличить SetPass Calls
Shader "Custom/TwoPassShader"
{
    SubShader
    {
        Pass
        {
            Name "FORWARD_BASE"
            // Первый пасс
        }
        Pass
        {
            Name "FORWARD_ADD"
            // Второй пасс для дополнительного света
        }
    }
}
// При использовании такого шейдера рендеринг объекта может вызвать два SetPass Call.

Ключевые различия и связь

МетрикаОписаниеВлияние на производительность
Draw CallКоманда отрисовки одного меша.Высокое количество увеличивает нагрузку на CPU (подготовка данных) и может лимитировать GPU.
SetPass CallКоманда изменения состояния шейдера/пасса.Частая смена состояния (шейдеров, текстур) очень затратна, так как нарушает поток данных на GPU.

Связь:

  • Один SetPass Call может обслуживать несколько Draw Calls, если они используют одинаковый шейдерный пасс (например, через статический или динамический батчинг).
  • Однако каждый новый материал или изменение параметров шейдера (например, разные текстуры) обычно вызывает новый SetPass Call, даже если Draw Calls батчингуются.
  • Многопроходные шейдеры (например, для декалей или сложных эффектов) существенно увеличивают SetPass Calls, потому что объект требует нескольких пассов для отрисовки.

Практические советы по оптимизации

  • Батчинг (Batching): Используйте Static Batching для неподвижных объектов и Dynamic Batching для мелких движущихся (с осторожностью, есть ограничения). Это уменьшает количество Draw Calls за счет объединения геометрии.
  • GPU Instancing: Для объектов с одинаковым мешем и материалом, но разными параметрами (например, цвет) — это мощный инструмент для сокращения как Draw, так и SetPass Calls.
  • Атласирование текстур (Texture Atlasing): Совмещение нескольких текстур в одну большую позволяет использовать один материал для разных объектов, снижая SetPass Calls.
  • Оптимизация материалов: Минимизируйте количество уникальных материалов и шейдеров на сцене. Используйте Shared Materials где возможно.
  • Анализ: В Frame Debugger или Profiler (раздел Rendering) можно увидеть детализированную информацию о каждом Draw и SetPass Call, что помогает точно определить узкие места.

Понимание разницы позволяет принимать правильные решения: иногда нужно снижать количество уникальных материалов (SetPass), а иногда — объединять объекты (Draw Calls). Идеальная оптимизация стремится минимизировать обе метрики одновременно.

В чем разница между Draw и SetPass Call? | PrepBro