<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kashif Nazir</title>
    <description>The latest articles on DEV Community by Kashif Nazir (@kashifnazir).</description>
    <link>https://dev.to/kashifnazir</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4208958%2F3782f642-ee2b-4910-9f44-48215614f311.png</url>
      <title>DEV Community: Kashif Nazir</title>
      <link>https://dev.to/kashifnazir</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kashifnazir"/>
    <language>en</language>
    <item>
      <title>Meta Quest 72 FPS: the mesh checklist that actually holds the frame budget</title>
      <dc:creator>Kashif Nazir</dc:creator>
      <pubDate>Mon, 26 Oct 2026 14:28:26 +0000</pubDate>
      <link>https://dev.to/kashifnazir/meta-quest-72-fps-the-mesh-checklist-that-actually-holds-the-frame-budget-4ej7</link>
      <guid>https://dev.to/kashifnazir/meta-quest-72-fps-the-mesh-checklist-that-actually-holds-the-frame-budget-4ej7</guid>
      <description>&lt;p&gt;72 frames per second means 13.9 milliseconds per frame — for everything:&lt;br&gt;
physics, scripts, and rendering, times two eyes. On Quest, dropped frames&lt;br&gt;
don't just look bad, they cause motion sickness. Meta targets 72 FPS&lt;br&gt;
minimum (Quest 2/3S) with 90 FPS ideal on Quest 3, and rendering typically&lt;br&gt;
gets about half the budget once game logic takes its share. So every item&lt;br&gt;
below exists to protect roughly 7ms of rendering time.&lt;/p&gt;

&lt;p&gt;Most Quest games that miss the target don't have a shader problem. They&lt;br&gt;
have a mesh problem. This is the checklist I run over a scene, in order:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Draw calls under ~150.&lt;/strong&gt; Check the Game view Stats panel →&lt;br&gt;
"Batches". Quest's mobile CPU chokes on draw-call overhead long before&lt;br&gt;
the GPU breaks a sweat. Combine meshes, bake texture atlases, and enable&lt;br&gt;
the SRP Batcher. And switch to Single Pass Instanced rendering (XR&lt;br&gt;
Plug-in Management settings) — it roughly halves your stereo draw calls&lt;br&gt;
versus Multi-Pass. If your project still uses Multi-Pass, switching to&lt;br&gt;
SPI is the single biggest one-setting win available.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Visible triangles under ~750k.&lt;/strong&gt; This is the widely used Quest&lt;br&gt;
comfort zone. Audit with the Frame Debugger or Profiler, find your&lt;br&gt;
heaviest meshes, and simplify them. Background geometry almost never&lt;br&gt;
needs the triangle density it ships with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. LODs on everything beyond arm's reach.&lt;/strong&gt; Use LODGroup with 2–3&lt;br&gt;
levels and aggressive cutoffs — in VR, distant detail is genuinely hard&lt;br&gt;
to see in a headset, so you can cut LOD0 → LOD1 earlier than on flat&lt;br&gt;
screens. Generate LODs for the whole library in one pass rather than&lt;br&gt;
hand-tuning per model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Textures: 1024 max for environments, ASTC compression.&lt;/strong&gt; Walls and&lt;br&gt;
floors at 1024, props at 512 or below. Large textures murder mobile fill&lt;br&gt;
rate on tile-based GPUs. ASTC is the compression format mobile GPUs&lt;br&gt;
actually like (6×6 or 8×8 block sizes are the sweet spot). Atlases help&lt;br&gt;
twice here: fewer draw calls AND fewer texture binds. Enable Mip&lt;br&gt;
Streaming too — it can cut texture memory by 30–50% in large scenes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Bake all lighting. Zero realtime lights.&lt;/strong&gt; Realtime shadows are one&lt;br&gt;
of the most expensive things you can do on Quest. Bake lightmaps, use&lt;br&gt;
light probes for dynamic objects, and turn the main directional light's&lt;br&gt;
shadows off or to the cheapest possible setting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Kill overdraw.&lt;/strong&gt; Transparent particles, overlapping UI, and layered&lt;br&gt;
alpha geometry destroy tile-based mobile GPUs. Audit with the overdraw&lt;br&gt;
view mode; replace alpha-blended particles with alpha-tested or opaque&lt;br&gt;
where possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Enable Fixed Foveated Rendering.&lt;/strong&gt; Via the Meta XR SDK, render the&lt;br&gt;
periphery at lower resolution — up to ~28% pixel shading savings with&lt;br&gt;
no perceptible quality loss. It's nearly free performance; there's no&lt;br&gt;
reason to ship without it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The order matters: simplify → LOD → combine → verify.&lt;/strong&gt; Simplifying&lt;br&gt;
first means your LODs and combined meshes are built from clean, light&lt;br&gt;
geometry instead of garbage-in-garbage-out. Then verify in the Stats&lt;br&gt;
panel (batches under 150, tris under 750k) and profile on-device with&lt;br&gt;
OVR Metrics — the editor lies about mobile performance.&lt;/p&gt;

&lt;p&gt;I build VR games at PixelFalconVR and Unity tools at BlackBox Creations.&lt;/p&gt;

&lt;p&gt;Full write-up with the code snippet for a runtime LOD bias on Quest:&lt;br&gt;
&lt;a href="https://kashi45248-prog.github.io/Blackbox_creations-/tutorial-meta-quest-72fps-mesh-optimization.html" rel="noopener noreferrer"&gt;https://kashi45248-prog.github.io/Blackbox_creations-/tutorial-meta-quest-72fps-mesh-optimization.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>vr</category>
      <category>gamedev</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
