72 frames per second means 13.9 milliseconds per frame — for everything:
physics, scripts, and rendering, times two eyes. On Quest, dropped frames
don't just look bad, they cause motion sickness. Meta targets 72 FPS
minimum (Quest 2/3S) with 90 FPS ideal on Quest 3, and rendering typically
gets about half the budget once game logic takes its share. So every item
below exists to protect roughly 7ms of rendering time.
Most Quest games that miss the target don't have a shader problem. They
have a mesh problem. This is the checklist I run over a scene, in order:
1. Draw calls under ~150. Check the Game view Stats panel →
"Batches". Quest's mobile CPU chokes on draw-call overhead long before
the GPU breaks a sweat. Combine meshes, bake texture atlases, and enable
the SRP Batcher. And switch to Single Pass Instanced rendering (XR
Plug-in Management settings) — it roughly halves your stereo draw calls
versus Multi-Pass. If your project still uses Multi-Pass, switching to
SPI is the single biggest one-setting win available.
2. Visible triangles under ~750k. This is the widely used Quest
comfort zone. Audit with the Frame Debugger or Profiler, find your
heaviest meshes, and simplify them. Background geometry almost never
needs the triangle density it ships with.
3. LODs on everything beyond arm's reach. Use LODGroup with 2–3
levels and aggressive cutoffs — in VR, distant detail is genuinely hard
to see in a headset, so you can cut LOD0 → LOD1 earlier than on flat
screens. Generate LODs for the whole library in one pass rather than
hand-tuning per model.
4. Textures: 1024 max for environments, ASTC compression. Walls and
floors at 1024, props at 512 or below. Large textures murder mobile fill
rate on tile-based GPUs. ASTC is the compression format mobile GPUs
actually like (6×6 or 8×8 block sizes are the sweet spot). Atlases help
twice here: fewer draw calls AND fewer texture binds. Enable Mip
Streaming too — it can cut texture memory by 30–50% in large scenes.
5. Bake all lighting. Zero realtime lights. Realtime shadows are one
of the most expensive things you can do on Quest. Bake lightmaps, use
light probes for dynamic objects, and turn the main directional light's
shadows off or to the cheapest possible setting.
6. Kill overdraw. Transparent particles, overlapping UI, and layered
alpha geometry destroy tile-based mobile GPUs. Audit with the overdraw
view mode; replace alpha-blended particles with alpha-tested or opaque
where possible.
7. Enable Fixed Foveated Rendering. Via the Meta XR SDK, render the
periphery at lower resolution — up to ~28% pixel shading savings with
no perceptible quality loss. It's nearly free performance; there's no
reason to ship without it.
The order matters: simplify → LOD → combine → verify. Simplifying
first means your LODs and combined meshes are built from clean, light
geometry instead of garbage-in-garbage-out. Then verify in the Stats
panel (batches under 150, tris under 750k) and profile on-device with
OVR Metrics — the editor lies about mobile performance.
I build VR games at PixelFalconVR and Unity tools at BlackBox Creations.
Full write-up with the code snippet for a runtime LOD bias on Quest:
https://kashi45248-prog.github.io/Blackbox_creations-/tutorial-meta-quest-72fps-mesh-optimization.html
Top comments (0)