id: 240 slug: physics-collider-optimization-in-complex-game-scenes title_ru: "Оптимизация физических коллайдеров в сложных сценах игр" tags: [vr-ar]
Оптимизация физических коллайдеров в сложных сценах игр
Сцена с 800 GameObject, у каждого MeshCollider по реальной геометрии — и PhysX тратит 8–12 мс на FixedUpdate только на Broadphase и Narrowphase проверки. Это половина фрейм-бюджета на одну физику. В VR, где бюджет фрейма 11 мс (90 FPS), это моментальный дроп. Оптимизация коллайдеров — одна из тех задач, где правильная архитектура с самого начала экономит недели работы потом.
Как PhysX тратит время и где потери
Физика в Unity проходит два этапа: Broadphase (быстрый отсев: какие объекты вообще близко друг к другу?) и Narrowphase (точная проверка пересечений для отфильтрованных пар).
Broadphase использует AABB-дерево (Axis-Aligned Bounding Box). Если объекты постоянно двигаются — дерево постоянно перестраивается. 200 Rigidbody с isKinematic = false, которые двигаются каждый фрейм, дают постоянный rebuild AABB-дерева. Решение: объекты, которые не двигаются в данный момент, переводим в isKinematic = true через скрипт — они выпадают из динамического дерева.
Narrowphase — это где MeshCollider убивает производительность. Проверка пересечения двух произвольных мешей — O(n×m) по треугольникам. Коллайдер персонажа против коллайдера здания с 50 000 треугольников — это тысячи операций за один Narrowphase. PhysX не поддерживает non-convex MeshCollider против MeshCollider в динамических объектах вообще — только против Static.
Практические замены и упрощения
Правило первое: заменяй MeshCollider там, где это не заметно игроку. Стул с MeshCollider по реальной геометрии — это 200 треугольников. Тот же стул с 2 BoxCollider (ножки + сиденье) — 2 примитива. Точность коллизии 95% от оригинала, стоимость — в 50 раз меньше.
Для органических форм (камни, бочки, машины) набор из 3–6 ConvexMeshCollider (выпуклые упрощённые меши) работает в разы быстрее non-convex и визуально неотличим. В Unity: MeshCollider.convex = true + упрощённый меш через LOD или ручное создание collision proxy в Blender.
Compound Colliders — набор примитивов как дочерние объекты одного Rigidbody. Это единственный способ получить «non-convex» динамическую физику без non-convex MeshCollider: несколько выпуклых кусков = сложная форма. Для оружия в VR, детализированных объектов, роботов — стандартный подход.
Collision Matrix (Layer Collision Matrix). В Physics Settings → Layer Collision Matrix отключаем проверки между слоями, которые никогда не должны взаимодействовать: Environment vs Environment, UI vs Physics Objects, VFX vs любой слой. Каждая отключённая пара — меньше Broadphase пар. При правильной настройке матрицы можно сократить количество активных пар на 30–50%.
Sleep Threshold. Rigidbody засыпает, когда скорость падает ниже Physics.sleepThreshold. Спящий Rigidbody не участвует в физике — почти нулевая стоимость. Значение по умолчанию (0.005) слишком низкое для сложных сцен: объекты остаются активными при микровибрациях. Для VR-сцен без симуляции жидкости/cloth ставим 0.1–0.2.
Инструменты диагностики
Physics Profiler в Unity Profiler — показывает время Broadphase, Narrowphase, отдельно SimulateAndCollide, UpdateTriggers. Здесь видно, где потери.
Physics Debugger (Window → Analysis → Physics Debugger) — визуализирует коллайдеры прямо в Scene View с цветовым кодированием по типу (Static, Dynamic, Kinematic, Trigger). Позволяет быстро найти объекты с неожиданно тяжёлыми коллайдерами.
PhysicsViewer кастомный Editor Tool — скрипт, который выводит список всех MeshCollider в сцене, отсортированных по количеству треугольников. Пишем за 30 минут, экономит часы поиска.
Из практики: в VR-тренажёре для промышленного оборудования сцена цеха содержала 1200 объектов, большинство с MeshCollider по импортированным CAD-моделям (15 000–80 000 треугольников каждый). Physics CPU time — 14 мс. После замены всех статичных MeshCollider на Convex proxy (автоматически через Editor скрипт + VHACD decomposition) и отключения ненужных Layer Matrix пар — Physics CPU time упал до 2.8 мс.
Этапы работы
Профилирование. Physics Profiler snapshot, определение bottleneck.
Аудит сцены. Инвентаризация всех коллайдеров, классификация по типу и стоимости.
Оптимизация. Замена MeshCollider на примитивы/Compound, настройка Layer Matrix, Sleep Threshold.
Инструменты автоматизации. Editor скрипты для batch-замены и валидации.
Повторное профилирование. Сравнение с baseline, документация изменений.
| Масштаб сцены | Ориентировочные сроки |
|---|---|
| 1 сцена до 500 объектов | 3–7 дней |
| Несколько сцен, 1000–3000 объектов | 2–4 недели |
| Крупный проект с автоматизированными инструментами | 1–2 месяца |
Стоимость рассчитывается после профилирования и оценки объёма изменений.





