Оптимізація графіки під частоту обновлення 72/90/120 Hz в VR
Пропущений кадр у VR – не просто заміна картинки. Це вестибулярний конфлікт: візуальна система говорить "ти стоїш", вестибулярний апарат говорить "ти рухаєшся". При регулярних дропах з'являється нудота. При 72 fps бюджет на кадр – 13.9 мс. При 90 – 11.1 мс. При 120 – 8.3 мс. Кожна мілісекунда на рахунку, та звичайні підходи до оптимізації "як у звичайній грі" тут не працюють.
Meta Quest 3 за замовчуванням запускається на 72 Hz – розробник повинен явно запросити 90 або 120 через OVRManager.display.displayFrequency. Але запросити мало: потрібно переконатись, що рендер-бюджет дозволяє не дропати кадри на обраній частоті, інакше система автоматично откатиться назад.
Де реально теряються мілісекунди
Найчастіша причина дропів – overdraw на прозорих матеріалах. VR рендерит два ока, та кожен напівпрозорий об'єкт малюється двічі. Ефекти частинок з десятьма шарами прозорості, які у звичайній грі коштують 1–2 мс, у VR легко стають 4–5 мс. RenderDoc дозволяє точно вимірити overdraw: у режимі Overdraw Heatmap одразу видно, де пікселі перерисовуються 8–12 разів.
Друга проблема – draw calls. На Quest 3 (Snapdragon XR2 Gen 2) GPU не так страшен, як CPU-overhead від великої кількості вызовів. 300 draw calls при неефективному батчингу – це 3–4 мс тільки на CPU-side. GPU Instancing працює добре для однакових мешей, Static Batching – для статики. Проблема в тому, що при Dynamic Batching геометрія трансформується на CPU, та це дорожче ніж просто окремий draw. Dynamic Batching у VR варто вимкнути та замінити ручним DrawMeshInstanced для динамічних об'єктів.
Третє – тіні. Real-time тіні у VR – роскіш. Навіть один каскадний Directional Light з Shadow Distance 30м на Quest коштує 3–5 мс. Стандартний підхід: запекати тіні в lightmap для статики, використовувати Blob Shadow Projector або псевдотіні для динамічних об'єктів. Якщо тіні необхідні – тільки один каскад, Shadow Distance не більше 10–15 м, PCF фільтрація замість VSM.
Fixed Foveated Rendering та Variable Rate Shading
FFR – головний інструмент оптимізації, яким не користуються за невіданням. Периферійне зрення людини значно менш чутливе до деталей, ніж центральне. FFR рендерит краї екрану з пониженою роздільністю – на Quest це налаштовується через OVRManager.fixedFoveatedRenderingLevel.
Рівні FFR від Low до HighTop: на High краї рендерються на 1/4 роздільності. Для більшості сцен непомітно – але економить до 20–30% GPU часу. Винятки: тонкий текст на периферії (UI-елементи по краях поля зору), тонкі лінії (проводи, решітки). Для цих об'єктів FFR можна вимкнути через OVROverlay – рендерити їх поверх основного шару без FFR-деградації.
Variable Rate Shading – більш гнучкий варіант, де швидкість шейдингу варіюється по тайлам екрану. У Unity 2022+ підтримується через ShadingRateImage API, але тільки на платформах з підтримкою VRS у залізі. Meta Quest 3 підтримує.
Процес оптимізації на практиці
Без даних – нема оптимізації. Перший крок завжди: профілювання через OVR Metrics Tool (для Quest) або Unity Profiler з підключенням до пристрою. Нас цікавить GPU time per frame, а не FPS – FPS може здаватися стабільним через Asynchronous SpaceWarp (ASW), який синтезує проміжні кадри при дропах. ASW маскує проблему, але не вирішує її.
Після профілювання – Frame Debugger для аналізу послідовності draw calls та RenderDoc для детального GPU capture. Зазвичай 80% GPU-часу займають 20% об'єктів. Оптимізуємо їх, а не все підряд.
Типовий результат роботи на реальному проекті: Quest 3, екшн-гра, старт – 68 fps при 72 Hz з періодичними дропами. Після аналізу: overdraw від particle systems (6 шарів ефектів сгоряння) – мінус 3.2 мс після замістити на атласні спрайти з 2 шарами. Тіні від трьох джерел світла – мінус 4.1 мс після заміни на запечені lightmaps. Dynamic Batching – вимкнено, додано GPU Instancing для дерев та каменів – мінус 1.8 мс CPU. Итог: стабільні 90 fps з запасом 2–3 мс.
Терміни
| Обсяг оптимізації | Терміни |
|---|---|
| Профілювання + рекомендації | 2–3 дні |
| Оптимізація рендеру (тіні, batching, FFR) | 1–2 тижні |
| Повна оптимізація під цільову частоту | 3–6 тижнів |
Вартість розраховується після аудиту проекту та визначення цільової платформи й частоти обновлення.





