id: 240 slug: physics-collider-optimization-in-complex-game-scenes title_ua: "Оптимізація фізичних колайдерів у складних ігрових сценах" 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 місяці |
Вартість розраховується після профілювання та оцінки обсягу змін.





