# Tutorial — Performance Profiling
*Augmented Traveler local tutorial.* Back to [[Unreal — Tutorials]] · headsets: [[Tutorial — OpenXR Headset Builds]] · kiosk look: [[Tutorial — Kiosk Lighting for a Life-Size MetaHuman]]
How to find out **why** a build is slow and fix the right thing. A figure that stutters breaks the illusion. On a headset it can make visitors feel sick.
> **Draft.** Record real numbers from the first kiosk and Quest builds in section 6.
## 1. Budgets
| Surface | Target | Frame budget |
|---|---|---|
| Kiosk | 60 fps (or locked 30 if agreed) | 16.7 ms (33.3 ms) |
| **Quest 3** | **72 fps minimum** (Meta requires 72/80/90/96/100/120 Hz for interactive apps) | **13.9 ms** at 72; 11.1 ms at 90 |
| Other standalone headsets | 72–90 fps | 11.1–13.9 ms |
| Pixel Streaming server | 60 fps at the stream resolution | 16.7 ms |
**Meta store check:** apps must hold their rate. Meta asks for at least 45 minutes of testing with **OVR Metrics Tool**. We use the same test for venue builds.
## 2. First look: stat commands (any build with a console)
| Command | Tells you |
|---|---|
| `stat fps` | Frame rate |
| `stat unit` | Frame, **Game** (CPU gameplay), **Draw** (CPU render), **GPU**, RHI times; in 5.8 also **VRAM**. The largest number is your bottleneck |
| `stat unitgraph` | The same, as a graph over time (spikes) |
| `stat gpu` | GPU time per pass (Lumen, shadows, hair, translucency…) |
| `ProfileGPU` (Ctrl+Shift+Comma) | The **GPU Visualizer**: a one-frame breakdown |
| `stat scenerendering`, `stat rhi` | Draw calls, primitives |
| `stat startfile` / `stat stopfile` | Record stats to a file |
**Rule:** find whether **CPU (Game or Draw)** or **GPU** is the limit **before** changing anything.
## 3. Deep look: Unreal Insights
1. Launch the build with tracing, for example `-trace=default,gpu,memory`. The default channels include Cpu, Gpu, Frame, Log and Bookmark.
2. Open **Unreal Insights** and load the trace, or connect live.
3. Use the **Timing view** to find slow frames and see what ran on each thread.
4. **Mark program moments** with `Trace.Bookmark` (for example "Monologue start", "Answer start") so you can find the Q&A spikes.
5. 5.8 adds annotations and UObject counters. **Memory Insights** and **LLM** (`-llm`) find memory growth over a long kiosk day.
## 4. Headset tools (Quest)
| Tool | Use |
|---|---|
| **OVR Metrics Tool** | On-device overlay: fps, CPU/GPU level, GPU utilisation; the 45-minute test |
| **Meta Quest Developer Hub** | Logs, performance analyser, device management |
| **RenderDoc Meta Fork** | GPU frame capture for Quest (tile-based rendering details) |
| **Unreal Insights on Quest** | Meta's guide for tracing UE5 on device |
| Android GPU Inspector | Adreno GPU profiling; Quest support not explicitly listed |
Meta's method: decide CPU- or GPU-bound, then capture. `xr.SecondaryScreenPercentage.HMDRenderTarget` reduces the pixel load.
## 5. Where MetaHumans cost the most, and what to do
| Cost | Fix |
|---|---|
| **Strand hair** | Cards on headsets (strands only at LOD0–1; cards at LOD2–5); groom LODs ([[Grooms — Tutorials]]) |
| **Face rig (RigLogic)** | 5.8 lets you set RigLogic precision and backend per platform (FP16 on mobile) and restores rig state in cooked builds |
| **LODs** | MetaHumans have 8 LODs. Mobile starts at LOD3 with 2K textures and cards; head vertices go from about 24,000 (LOD0) to 130 (LOD7). Force LODs to test |
| **Cloth simulation** | Skinned-only garments on headsets ([[Tutorial — Period Layers, Hoops and Skirts]]) |
| **Live lip sync** | GPU-heavy: measure the MetaHuman audio source versus Audio2Face on the target ([[Tutorial — Authoring a Q&A Experience with Ambient Idle]]) |
| **Lighting** | Kiosk: fewer shadowed lights, Lumen Lite, TSR percentage. Headsets: baked only ([[Tutorial — Place Kits for Historic Interiors]]) |
| **Shader stutter** | Quest: 5.8 disables the chunked PSO cache on Quest; collect PSOs during QA runs to reduce hitches |
## 6. Our measurements (fill in)
| Build | Date | Scene | fps | Game ms | Draw ms | GPU ms | Bottleneck | Notes |
|---|---|---|---|---|---|---|---|---|
| Kiosk | | Mitchell monologue | | | | | | |
| Kiosk | | Mitchell Q&A | | | | | | |
| Quest 3 | | Vestal House room | | | | | | |
## 7. Check before any venue build
- [ ] Holds target fps through a full program cycle (soak test ≥ 45 min on Quest; a full day on the kiosk)
- [ ] No hitches over 50 ms in Insights during monologue-to-Q&A transitions
- [ ] Memory flat over a long run (no leak)
- [ ] Numbers recorded in section 6
## Sources
- Epic, Trace quick start (Unreal Insights): https://dev.epicgames.com/documentation/unreal-engine/trace-quick-start-guide-in-unreal-engine
- Epic, Memory Insights: https://dev.epicgames.com/documentation/unreal-engine/memory-insights-in-unreal-engine
- Epic, Low-Level Memory Tracker: https://dev.epicgames.com/documentation/en-us/unreal-engine/using-the-low-level-memory-tracker-in-unreal-engine
- Epic, Stat commands: https://dev.epicgames.com/documentation/en-us/unreal-engine/stat-commands-in-unreal-engine
- Tom Looman, UE 5.8 performance highlights: https://tomlooman.com/unreal-engine-5-8-performance-highlights/
- Meta, VRC.Quest.Performance.1: https://developers.meta.com/horizon/resources/vrc-quest-performance-1/
- Meta, Performance optimisation for mobile (Unreal): https://developers.meta.com/horizon/documentation/unreal/po-perf-opt-mobile/
- Meta, OVR Metrics Tool: https://developers.meta.com/horizon/documentation/unreal/ts-ovrmetricstool/
- Meta, MQDH logs and metrics: https://developers.meta.com/horizon/documentation/unreal/ts-mqdh-logs-metrics/
- Meta, RenderDoc for Quest: https://developers.meta.com/horizon/documentation/native/android/ts-renderdoc-for-oculus/
- Meta, Unreal Insights on Quest: https://developers.meta.com/horizon/documentation/unreal/ts-unreal-insights-ue5/
- Android GPU Inspector: https://developer.android.com/agi
- Epic, MetaHuman platform support and LOD specifications: https://dev.epicgames.com/documentation/metahuman/platform-support-and-lod-specifications-for-metahumans
- Epic, Controlling MetaHuman LODs: https://dev.epicgames.com/documentation/metahuman/controlling-metahuman-levels-of-detail-lods-in-unreal-engine
- Epic, MetaHuman 5.8 release notes (RigLogic per platform): https://dev.epicgames.com/documentation/metahuman/metahuman-5-8-release-notes-in-unreal-engine
- Full list: [[Sources — 2026-09-20]]