UNDERSTANDING & REDUCING DRAW CALLS IN UNITY

Unlock locked 60 FPS on mobile devices by mastering URP's SRP Batcher, GPU Instancing, Static Mesh Batching, and Texture Atlasing.

1. What is a Draw Call and a SetPass Call?

A Draw Call is a command issued by the CPU to the graphics API (Vulkan, DirectX, Metal, OpenGL ES) telling the GPU to draw a specific mesh with a specific material.

The real performance bottleneck is rarely the vertex count itself—it is the SetPass Call (Render State Change). Switching shaders, swapping textures, or binding new uniform buffers forces the CPU driver to flush pipelines, creating massive CPU bottlenecks.

2. The 4 Ways to Batch Meshes in Unity

1. SRP Batcher (URP Default)
Caches material constant buffers in persistent GPU memory. Multiple objects sharing the same shader program (even with different textures/colors) render without SetPass stalls.
2. GPU Instancing
Draws hundreds of identical meshes (trees, asteroids, missile smoke particles) in a single draw call with per-instance transform/color buffers.
3. Static Batching
Combines non-moving static environmental geometry into a massive combined vertex buffer at build time (Check Batching Static in Inspector).
4. Texture Atlasing
Combining multiple building, prop, or UI textures into a single 2048x2048 sheet allows different models to share one single Material.

3. How to Ensure SRP Batcher Compatibility

In the Unity Frame Debugger, you will often see "SRP Batcher not compatible". To make custom shaders compatible:

  • All per-material properties must be declared inside a CBUFFER_START(UnityPerMaterial) constant buffer.
  • All per-instance transforms must be wrapped in CBUFFER_START(UnityPerDraw).
  • Avoid using MaterialPropertyBlocks on SRP Batcher materials (use GPU Instancing instead if per-instance material blocks are required).

4. Target Frame Budget for Android

Low-End Android (Budget Phones)
Max Batches: 60 – 100
Max Triangles: 80k – 150k
Shadow Cascades: 1 (or Baked Shadows)
Mid-to-High Android / iOS
Max Batches: 150 – 250
Max Triangles: 300k – 600k
Shadow Cascades: 2

Related Performance Guides & Tools

Frequently Asked Questions

In Forward rendering pipelines, if multiple realtime point lights overlap a mesh, Unity must render additional lighting passes for each light affecting that object, effectively multiplying the draw calls. In URP, enable Forward+ Rendering (or use light cookies / baked lightmaps) to decouple lighting passes from draw calls.
Select the Material in your Project window, scroll down to the bottom of the Inspector panel, and check the box labeled Enable GPU Instancing. Ensure the shader supports instanced vertex buffers.