Оптимізація графіки під VR/AR пристрої
У VR кадр потрібно рендерити двічі — для лівого та правого ока. На Quest 2 це 72 fps × 2 = 144 Draw Call-пачки в секунду. Якщо ваш проект не пройшов через Single Pass Instanced Rendering та у вас більше 100 batches на кадр, стереоскопічна сцена просто не уляжеться в тайм-слот GPU. Головна біль та тошнота у користувачів — прямий наслідок dropped frames.
AR-проекти на ARCore/ARKit додають поверх цього захоплення з камери, обробку площин та occlusion mesh. Пристрій уже завантажена CPU-завданнями трекінгу до того, як ваш шейдер зробив перший виклик.
Чому стандартні поради «зменши полігони» не працюють у XR
Зниження полігонажу — це останнє, що ми робимо. Спочатку дивимось на те, що реально убиває продуктивність на XR-пристроях.
Overdraw у мобільному VR. На Adreno та Mali GPU overdraw коштує непропорційно дорого — тайловий рендер не любить велику кількість напівпрозорих об'єктів один на одному. Стандартні particle-системи з Additive-блендингом на фоні HDR-скайбокса — типовий убивця frame rate на Quest. Frame Debugger у Unity показує це миттєво: шукаємо червоні зони в overdraw view.
Foveated Rendering настроєний неправильно або взагалі не включений. Fixed Foveated Rendering на Meta XR SDK знижує навантаження на GPU на 15-30% без помітного погіршення картинки — але тільки якщо правильно обраний рівень (Low/Medium/High) під конкретний контент. У динамічних сценах з швидким рухом камери High-рівень дає артефакти на периферії.
Single Pass Instanced не працює з кастомними шейдерами. Якщо у проекті є хоча б один шейдер без UNITY_VERTEX_INPUT_INSTANCE_ID та UNITY_SETUP_INSTANCE_ID, весь рендер автоматично fallback'ається в Multi Pass. Це удвічі збільшує навантаження. Знаходимо через XR Plug-in Management → Rendering Stats.
Як ми працюємо з XR-проектами
Починаємо з профілювання на цільовому залізі — не в Editor, а на пристрої. RenderDoc для Android, Xcode Instruments для iOS/visionOS, OVR Metrics Tool для Meta. Емулятор не покаже реальних затримок пам'яті та bandwidth.
Типовий кейс з практики. Проект під Quest 3 — архітектурна візуалізація, 8 кімнат, PBR-матеріали. Перший білд: 45 fps в центрі сцени, 28 fps при виглядінні у сторону вікна. Аналіз через OVR Metrics Tool показав 340 Draw Calls та 4 overdraw-шари на оконних стіклах. Рішення: GPU Instancing для повторюваної меблі (стільці × 24 → 1 Draw Call), замена стекла з Standard Transparent на кастомний шейдер з Surface Type Opaque + альфа у clip, включення Fixed Foveated Rendering рівня Medium. Результат: 72 fps стабільні, thermal throttling зник.
Для AR-проектів окремо прорабляємо occlusion — AR Foundation Environment Depth вимагає коректної настройки глибини у шейдерах, інакше віртуальні об'єкти «просвічують» крізь реальні поверхні.
Інструменти, які використовуємо:
- Unity Profiler + Frame Debugger (GPU Usage module)
- RenderDoc (Android Vulkan/OpenGL ES)
- Meta Quest Developer Hub + OVR Metrics Tool
- XR Interaction Toolkit Profiling Guidelines
- ARM Mobile Studio (Streamline) для Adreno/Mali deep-dive
Shader Graph оптимізуємо вручну — дивимось на instruction count у Preview вікні, видаляємо лишні sample операції, переносимо обчислення з Fragment у Vertex там, де допустима інтерполяція.
Етапи роботи над оптимізацією XR-графіки
Спочатку збираємо білд у Release-конфіґурації та знімаємо baseline-метрики: fps, GPU time per frame, Draw Calls, memory footprint. Без baseline неможливо оцінити результат.
Потім — аудит сцени: ієрархія об'єктів, кількість унікальних матеріалів, настройки освітлення (статичне/динамічне), наявність real-time тіней (на мобільному VR вони майже завжди під забороною), LOD-групи.
Після аудиту готуємо план оптимізації з пріоритетами за impact/effort. Реалізація йде ітераціями з проміжними замірами — важливо не втратити baseline та розуміти, що саме дало прирост.
Фінальний етап — тепловое тестування на пристрої 20-30 хвилин у умовах нагрівання. Thermal throttling на мобільних чипах (Snapdragon XR2) починається раніше, ніж здається.
| Масштаб завдання | Орієнтовні строки |
|---|---|
| Аудит + звіт без правок | 2–4 дні |
| Оптимізація однієї сцени (до 500 об'єктів) | 1–2 тижні |
| Повний проект (5–15 сцен, кастомні шейдери) | 3–6 тижнів |
| Портування PC VR → standalone Quest | 4–8 тижнів |
Вартість розраховується індивідуально після аудиту проекту та цільової платформи.
Частые ошибки при підготовці XR-графіки
Real-time тені на мобільному VR. Cascaded Shadow Maps з 4 каскадами на Quest — це гарантовані dropped frames. Замінюємо на запечені у Lightmap або Blob Shadow (простий проектор).
MSAA вище 4x не вимкнений. На тайлових GPU (Adreno) MSAA 8x ломає продуктивність. У XR Project Settings ставимо 4x максимум, у складних сценах — 2x.
Текстури без Mipmap. У VR об'єкти можуть бути на різних відстанях від камери одночасно. Без Mipmap GPU бере повне розрішення для далеких об'єктів — bandwidth зростає без причини.
Physics Colliders складніше необхідного. Mesh Collider на об'єктах інтер'єру там, де достатньо Box/Capsule. У VR physics tick теж впливає на frame time.





