AR/VR
Оптимизация производительности VR
2014 год. Oculus Connect 1. Джон Кармак произносит: "90 FPS или тошнота". Человеческий вестибулярный аппарат замечает задержку свыше 20 мс - и мозг решает, что это яд. 90 кадров в секунду дают ровно 11 мс на кадр. В два раза жёстче 60 FPS gaming. VR - единственная область, где пропущенный кадр вызывает физическое недомогание у пользователя.
- Meta Quest 3: motion-to-photon latency 12 мс; Fixed Foveated Rendering снижает GPU нагрузку на 30-50% без видимой потери качества
- Valve Index: 144 Гц режим - 7 мс на кадр, самый жёсткий бюджет в потребительском VR
- Beat Saber: первый VR хит с 10+ млн копий - оптимизация через упрощение: нет сложной геометрии, нет LOD, нет culling проблем - сцена намеренно простая
- Half-Life: Alyx: PC VR, 6 лет разработки - 72/90 Гц цель при динамическом разрешении (Dynamic Resolution Scaling как аналог ATW для GPU)
Фрейм-бюджет: 11 миллисекунд или тошнота
2014 год. Oculus Connect 1. Джон Кармак выходит на сцену и произносит фразу, ставшую индустриальным стандартом: "90 FPS или тошнота". Не 60 - порог обычного гейминга. Не 72 - минимум для некоторых гарнитур. Именно 90. Человеческий вестибулярный аппарат фиксирует рассогласование зрения и вестибулы уже при задержке свыше 20 мс. При 90 FPS на каждый кадр - ровно 11 мс. Для сравнения: 60 FPS дают 16.7 мс. VR работает в полтора раза жёстче.
Бюджет кадра - это не абстракция. Это хронометраж реального конвейера. CPU-фаза: обновление физики, скриптов, AI, анимаций. GPU-фаза: рендеринг геометрии, шейдеры, постпроцессинг. Reprojection и display pipeline. Всё это - в сумме - должно уложиться в 11 мс. Meta Quest 3 достигает motion-to-photon latency в 12 мс. Valve Index на 144 Hz - 7 мс. Каждая оптимизация в этом уроке - борьба за эти миллисекунды.
**Стерео - удвоенная нагрузка**: VR рендерит две камеры (левый и правый глаз), каждая со своей матрицей проекции. Наивный подход - два независимых draw call на каждый объект. Итог: GPU нагрузка x2. Решение - **Multiview rendering** (Vulkan extension `VK_KHR_multiview`): один draw call, GPU сам рендерит в обе текстуры. Экономия: 30-50% GPU времени на геометрическом этапе.
Правило большого пальца для разработки под Quest 3: CPU - не более 4 мс, GPU - не более 7 мс. Если CPU упирается - оптимизировать скрипты и физику. Если GPU - рендеринг и шейдеры. Unity Frame Debugger и RenderDoc показывают точную разбивку. Первый шаг любой VR-оптимизации - измерить, где горит. Без профайлера - гадание на кофейной гуще.
Почему для VR требуется 90 FPS, а не стандартные 60 FPS для игр?
Foveated Rendering и ATW: обмануть мозг, сохранить кадр
Человеческий глаз - не равномерная камера. Ямка (fovea) - центральная зона диаметром около 5 градусов - видит в максимальном разрешении. Периферия - размыта. Сетчатка буквально содержит меньше фоторецепторов по краям. **Foveated Rendering** эксплуатирует эту анатомию: центр рендерится в полном разрешении, периферия - в пониженном. Никто не замечает. Экономия GPU: 30-50% в зависимости от агрессивности.
Два вида: **Fixed Foveated Rendering (FFR)** - просто снижает разрешение по краям без отслеживания взгляда. Работает на Meta Quest без eye tracking. **Eye-tracked Foveated Rendering (ETFR)** - требует eye tracking (Quest Pro, Apple Vision Pro, PS VR2); рендерится именно там, куда смотрит пользователь. ETFR даёт больший выигрыш, но требует low-latency eye tracking с частотой 120+ Гц, иначе гало заметно при быстрых движениях глаз.
**Asynchronous TimeWarp (ATW)** - другой вид обмана, на уровне системы. Когда приложение пропускает кадр (не успело в 11 мс), ATW не показывает старый кадр как есть. Вместо этого - берёт последний отрендеренный кадр и применяет к нему трансформацию на основе актуального положения головы. Математически: небольшая репроекция текстуры. Визуально: плавное движение вместо рывка. Это работает, потому что голова повернулась, но сцена не изменилась - репроекция плоского изображения даёт приемлемый результат.
**ATW vs ASW**: ATW (Asynchronous TimeWarp) - репроекция на основе ротации головы, работает всегда, запускается runtime'ом. ASW (Asynchronous SpaceWarp, Meta) - идёт дальше: пытается предсказать движение объектов в сцене используя optical flow, и вставляет синтетические кадры. При 45 FPS приложения ASW генерирует промежуточные кадры, пользователь ощущает 90 FPS. Ценой: motion blur на движущихся объектах и артефакты на краях. ASW - аварийный режим, а не норма.
**Правило ATW**: если ATW срабатывает редко (< 1% кадров) - приложение работает нормально. Если часто - это симптом, не решение. Meta OVR Metrics Tool показывает процент кадров с ATW в реальном времени. Цель: 0% ATW в целевых сценариях.
Чем Fixed Foveated Rendering (FFR) принципиально отличается от Eye-Tracked Foveated Rendering (ETFR)?
Draw Calls, Batching и VR LOD
Draw call - команда CPU к GPU: "нарисуй этот mesh с этим материалом". Каждый вызов несёт накладные расходы: валидация состояния, передача данных по шине, синхронизация. В обычном гейминге 2000-3000 draw calls на кадр - норма. В мобильном VR (Quest 3) - предел 100-150. Причина: мобильный GPU работает в разы медленнее PC, а бюджет - те же 11 мс. Умножить на два за стерео.
**Static Batching** - Unity объединяет неподвижные объекты с одинаковым материалом в один mesh на этапе сборки. Один draw call вместо 50. Цена: больше памяти (объединённый mesh хранится в RAM). **Dynamic Batching** - то же самое для мелких движущихся объектов в рантайме. Ограничение: mesh должен быть < 300 вертексов. **GPU Instancing** - один draw call рисует тысячи экземпляров одного mesh (деревья, камни, NPC одной модели) с разными трансформациями. Идеально для VR открытых сцен.
**LOD (Level of Detail)** в VR работает по тому же принципу, что и в обычных играх, но с другими порогами. Удалённый объект получает упрощённый mesh. В VR добавляется специфика: LOD переключается агрессивнее, потому что GPU-бюджет вдвое жёстче. Meta рекомендует LOD0 (полный) до 5 метров, LOD1 (50% полигонов) до 20 метров, LOD2 (25%) дальше. Imposter rendering - на дальних дистанциях объект заменяется billboard-спрайтом. Для неподвижных объектов это практически незаметно при движении.
**Occlusion Culling в VR**: стандартный Occlusion Culling из Unity работает, но с нюансом - для стерео нужно culling с двух позиций (левый и правый глаз). Meta XR SDK включает **Layer Projection** с корректным стерео culling. Типичный выигрыш в сложных сценах: 20-40% GPU экономии за счёт отброса невидимой геометрии.
Реальный флоу оптимизации под Quest 3: 1) OVR Metrics Tool - смотреть GPU/CPU время и процент ATW. 2) Unity Frame Debugger - найти виновные draw calls. 3) Combine Static - всё статическое с одним материалом. 4) GPU Instancing - деревья, NPC, повторяющиеся объекты. 5) LOD Group - агрессивно. 6) FFR Medium. 7) Texture compression: ASTC вместо uncompressed. Только после этого - упрощение шейдеров.
ATW и ASW решают проблему производительности - можно таргетировать 45 FPS и положиться на систему
ATW/ASW - аварийный fallback, не целевой режим. Они вносят артефакты (ghosting, edge bleeding) и не работают корректно при быстром движении объектов в сцене.
Meta рекомендует 0% ATW в нормальном режиме работы. Если ASW активен постоянно - это значит приложение постоянно пропускает кадры. Правильное решение: профайлер, найти bottleneck, оптимизировать. Полагаться на ASW - проектировать под деградированный режим.
Почему лимит draw calls на мобильном VR (Quest 3) составляет ~100-150, а не 2000-3000 как в PC gaming?
Ключевые идеи
- **90 FPS = 11 мс** на кадр - физиологический порог, не маркетинг. Вестибулярный аппарат фиксирует задержку > 20 мс. Стерео удваивает нагрузку. CPU < 4 мс, GPU < 7 мс - практические цели для Quest 3.
- **Foveated Rendering** (FFR/ETFR) эксплуатирует анатомию глаза: периферия рендерится в меньшем разрешении, никто не замечает. ATW репроецирует последний кадр при промахе - аварийный fallback, не норма.
- **Draw calls < 150** на мобильном VR. GPU Instancing, Static Batching, Multiview rendering - три инструмента. LOD агрессивнее чем в PC играх: LOD0 до 5 м, imposter на дальних дистанциях.
- Workflow оптимизации: OVR Metrics Tool → Frame Debugger → Combine Static → Instancing → LOD → FFR → ASTC текстуры. Профайлер - первый шаг, всегда.
Связанные темы
VR оптимизация строится на основах рендеринга, компьютерной графики и real-time систем.
- VR Рендеринг — Фундамент: rendering pipeline, latency, motion-to-photon
- VR Interaction Design — Comfort vignette и snap rotation - UI-уровень оптимизации под киберболезнь
- Компьютерная графика: шейдеры и пайплайн — Draw calls, batching, LOD - базовые концепции из CG
- Real-time системы — 11 мс дедлайн VR - типичное hard-RT ограничение
- Разработка игр: игровой цикл — Game loop и бюджет кадра - то же самое, но VR порог в 1.5x жёстче
Вопросы для размышления
- Apple Vision Pro использует Eye-tracked Foveated Rendering и eye tracking 100+ Гц. Какие новые возможности это открывает для UI-дизайна, и какие проблемы создаёт с точки зрения privacy?
- ATW репроецирует последний кадр при промахе дедлайна. В каких сценариях репроекция будет особенно заметна пользователю - и как это влияет на жанровые ограничения VR?
- 90 FPS - текущий стандарт. Valve Index поддерживает 144 Гц. Даёт ли увеличение выше 90 Гц реальный прирост комфорта, или вестибулярная физиология уже удовлетворена - и ресурсы лучше тратить на разрешение и FOV?
Связанные уроки
- arvr-04 — VR рендеринг - база для понимания frame pipeline и latency
- cg-04 — LOD и culling в CG - то же самое, удвоенное для стерео
- cg-05 — Batching и draw calls: основы из CG, в VR требования жёстче в 2x
- gd-03 — Game loop и бюджет кадра: та же логика, другой порог (11ms vs 16ms)
- rts-01 — Real-time constraints: жёсткий дедлайн кадра как hard-RT задача
- par-01