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

В чём разница между Occlusion Culling и Frustum Culling?

1.7 Middle🔥 171 комментариев
#Оптимизация#Рендеринг и графика

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

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

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

Разница между Occlusion Culling и Frustum Culling

В Unity и компьютерной графике вообще, Occlusion Culling и Frustum Culling — это два фундаментальных, но совершенно разных метода оптимизации рендеринга. Их основная цель — снизить нагрузку на GPU, избегая отправки объектов, которые не будут видимы в конечном изображении. Однако принципы их работы и области применения сильно отличаются.

Frustum Culling (Отсечение по пирамиде видимости)

Frustum Culling — это первый и самый базовый уровень оптимизации. Его задача — определить, находится ли объект внутри пирамиды видимости (view frustum) камеры.

  • Принцип работы: Пирамида видимости — это геометрическая область пространства, которую камера фактически «видит». Это объем, ограниченный ближней и дальней плоскостью отсечения, а также углом обзора камеры. Система проверяет bounding volume (граничивающий объем, например, BoundingBox или BoundingSphere) каждого рендеренного объекта. Если объем полностью находится вне пирамиды, объект не отправляется на рендеринг.
  • Когда применяется: Процесс выполняется автоматически для каждого объекта на этапе Camera.Render перед отправкой данных в GPU. Это чрезвычайно эффективно для удаления объектов, находящихся позади камеры или слишком далеко в стороне.
  • Ограничения: Frustum Culling не учитывает, виден ли объект сквозь другие объекты. Например, дом, находящийся внутри пирамиды видимости, будет рендериться, даже если он полностью закрыт от камеры более близким и крупным зданием.

В Unity этот процесс встроен в рендер-пайплайн и выполняется автоматически. Его можно представить как простую геометрическую проверку:

// Пример логики, примерно реализуемой движком при Frustum Culling
bool IsInFrustum(Vector3 objectPosition, Camera camera) {
    // Преобразуем позицию объекта в пространство камеры (view space)
    Vector3 viewPos = camera.worldToCameraMatrix.MultiplyPoint(objectPosition);

    // Проверяем, находится ли позиция внутри ближней/дальной плоскости и по горизонтали/вертикали
    // (Упрощённо. В реальности проверяется bounding volume)
    return viewPos.z > camera.nearClipPlane && viewPos.z < camera.farClipPlane 
           && Mathf.Abs(viewPos.x) < someHorizontalLimit 
           && Mathf.Abs(viewPos.y) < someVerticalLimit;
}

Occlusion Culling (Отсечение по перекрытию)

Occlusion Culling — это более сложная и «интеллектуальная» техника. Она определяет, виден ли объект, находящийся внутри пирамиды видимости, или же он полностью перекрыт (occluded) другими объектами, расположенными между ним и камерой.

  • Принцип работы: Система заранее, часто на этапе подготовки данных (например, в редакторе Unity), анализирует статическую геометрию уровня и вычисляет, какие области пространства не будут видимы из определенных точек зрения. В Unity для этого используется Occlusion Culling Window, где на основе статических Occluder (объектов, перекрывающих обзор) и Occludee (объектов, которые могут быть перекрыты) строится набор данных (обычно это клеточная структура или PVS — Potentially Visible Set). Во время выполнения игры, для текущей позиции камеры быстро определяется, какие клетки (и объекты в них) потенциально видимы, а какие гарантировано скрыты.
  • Когда применяется: Процесс требует предварительной настройки и bake'а данных. Он особенно критичен для сложных, плотных городских или внутренних (интерьерных) сцен, где множество объектов расположены друг за другом.
  • Ограничения: Традиционно работает лучше со статической геометрией. Динамические объекты сложнее обрабатывать как эффективные Occluders. Также процесс bake'а может занимать значительное время и требует дополнительных ресурсов памяти для хранимых данных.

Настройка Occlusion Culling в Unity делается через редактор:

  1. В Window > Rendering > Occlusion Culling открывается панель управления.
  2. Статические объекты, которые должны перекрывать обзор, помечаются как Occluder.
  3. Статические объекты, которые могут быть скрыты, помечаются как Occludee.
  4. Нажимается Bake для предварительного расчета.

Ключевые различия в виде списка

  • Принцип отсечения:
    *   **Frustum Culling:** Отсекает объекты, находящиеся *вне* поля зрения камеры.
    *   **Occlusion Culling:** Отсекает объекты, находящиеся *внутри* поля зрения, но *скрытые* другими объектами.
  • Сложность и стоимость:
    *   **Frustum Culling:** Простая, быстрая математическая проверка. Выполняется в реальном времени для каждого объекта практически бесплатно.
    *   **Occlusion Culling:** Сложный предварительный расчет (bake) и использование дополнительных данных в памяти. Проверка во время выполнения тоже быстрая, но основана на этих заранее приготовленных данных.
  • Объекты применения:
    *   **Frustum Culling:** Автоматически применяется ко *всем* рендеренным объектам, статическим и динамическим.
    *   **Occlusion Culling:** В классической реализации наиболее эффективно работает со *статической* геометрией уровня. Динамические объекты обычно являются только Occludee.
  • Необходимость настройки:
    *   **Frustum Culling:** Включен всегда и не требует настроек от разработчика.
    *   **Occlusion Culling:** Требует явной настройки в редакторе, выделения объектов и процесса bake'а.

Практический вывод для разработчика в Unity

Для оптимальной производительности следует использовать оба метода.

  • Frustum Culling — это ваш неизменный базовый защитник, отсекающий очевидный мусор.
  • Occlusion Culling — это ваш стратегический инструмент для сложных сцен. Если у вас есть большой статический уровень с множеством перекрывающих элементов (например, здания в городе, комнаты в подземелье), вам обязательно нужно настроить и bake Occlusion Culling. Это позволит избежать рендеринга сотен скрытых объектов (например, мебели в комнате за закрытой стеной), что даёт огромный прирост в FPS, особенно на мобильных устройствах или в сложных проектах. Для полностью открытых, простых сцен (например, пустой ландшафт) Occlusion Culling может не дать значительной выгоды.
В чём разница между Occlusion Culling и Frustum Culling? | PrepBro