LibraryDraw Calls and Batching

Draw Calls and Batching

Learn about Draw Calls and Batching as part of AR/VR Development with Unity XR

Understanding Draw Calls and Batching in Unity XR

In Extended Reality (XR) development with Unity, optimizing performance is crucial for a smooth and immersive user experience. One of the most significant performance bottlenecks is the number of draw calls your application makes to the GPU. This module will explore what draw calls are and how batching techniques can be used to reduce them, thereby improving frame rates and overall efficiency.

What are Draw Calls?

A draw call is a command issued by the CPU to the GPU to draw a specific object or set of objects on the screen. Each draw call involves sending data such as vertex information, material properties, textures, and shader programs to the GPU. While necessary for rendering, each draw call incurs overhead for both the CPU and GPU. Too many draw calls can overwhelm the CPU, preventing it from preparing subsequent frames efficiently, leading to performance drops.

Each draw call is a CPU instruction to the GPU to render something.

Think of a draw call as telling the GPU, 'Draw this specific object with these specific settings.' The CPU has to prepare all the necessary information for each object before sending it off.

The process of a draw call involves the CPU preparing a batch of data for the GPU. This data includes vertex buffer objects (VBOs), index buffer objects (IBOs), texture bindings, shader programs, and various state changes (like blending modes or depth testing). The CPU then issues a command to the GPU to execute this rendering instruction. The GPU then processes this data to render the geometry. The overhead associated with preparing and issuing these commands is what contributes to CPU-bound performance issues when draw call counts are high.

What is the primary role of a draw call in graphics rendering?

A draw call is a command from the CPU to the GPU to render a specific object or set of objects, involving the transfer of rendering data.

The Impact of Draw Calls on Performance

In XR, maintaining a high and stable frame rate (e.g., 72-90 FPS) is paramount for preventing motion sickness and ensuring a believable experience. When the CPU is busy issuing many draw calls, it can't keep up with the demands of the XR pipeline, which includes tracking, input processing, and preparing the next frame. This can lead to stuttering, dropped frames, and a generally poor user experience. Therefore, minimizing draw calls is a fundamental optimization strategy.

High draw call counts are a common cause of CPU-bound performance issues in real-time graphics applications like XR.

Batching: Reducing Draw Calls

Batching is a technique used to combine multiple objects that share similar rendering properties into a single draw call. By reducing the number of individual draw calls, batching significantly alleviates CPU overhead. Unity offers several types of batching:

Static Batching

Static batching is performed by Unity at build time. It combines meshes that are marked as 'static' (i.e., they do not move or change during runtime) into larger meshes. This is highly effective for static environments and props. However, it increases memory usage as the combined meshes are stored in memory.

Dynamic Batching

Dynamic batching is performed by Unity at runtime. It batches small, dynamic objects that share the same material and have a limited number of vertices. Dynamic batching is more memory-efficient than static batching but has a higher CPU cost during runtime as it's processed each frame. It's generally suitable for a large number of small, similar objects that move.

GPU Instancing

GPU instancing allows you to draw multiple copies of the same mesh with the same material in a single draw call. Each instance can have unique properties (like position, rotation, color) passed via per-instance data. This is highly efficient for rendering large numbers of identical objects, such as trees, rocks, or crowds, and is often preferred over dynamic batching for its performance benefits.

Imagine you have 100 identical trees. Without batching, each tree might require its own draw call. With GPU instancing, you can tell the GPU to draw the tree mesh 100 times, but only send the tree's unique position and rotation data once per instance, all within a single draw call. This dramatically reduces the CPU's workload.

📚

Text-based content

Library pages focus on text content

Batching TypeWhenMemory UsageCPU OverheadBest For
Static BatchingBuild TimeHighVery Low (at runtime)Static environments, props
Dynamic BatchingRuntimeLowModerate (at runtime)Small, moving objects with same material
GPU InstancingRuntimeLowVery Low (per instance data)Many identical, moving objects

Key Considerations for XR

In XR, the performance budget is tight. Always profile your application to identify draw call bottlenecks. While batching is powerful, be mindful of its trade-offs. Static batching can increase memory, and dynamic batching has runtime CPU costs. GPU instancing is often the most efficient for large numbers of identical objects. Ensure objects share materials whenever possible, as different materials typically require separate draw calls.

What is the primary benefit of using GPU instancing?

GPU instancing allows drawing many identical objects with unique properties in a single draw call, significantly reducing CPU overhead.

Learning Resources

Unity Manual: Draw Call Batching(documentation)

Official Unity documentation explaining the concepts and implementation of static and dynamic batching.

Unity Manual: GPU Instancing(documentation)

Detailed explanation of GPU instancing, its benefits, and how to implement it in Unity.

Unity Learn: Optimizing Graphics Performance(tutorial)

A learning pathway covering various graphics optimization techniques in Unity, including draw calls and batching.

Unity Blog: Understanding GPU Instancing(blog)

A blog post from Unity explaining the advantages and use cases of GPU instancing for performance.

Unity Blog: Optimizing for VR Performance(blog)

Discusses general VR performance optimization strategies, often touching upon draw call reduction.

GDC Talk: Unity Graphics Performance Deep Dive(video)

A technical talk from GDC that often delves into the specifics of draw calls and optimization techniques in Unity.

Unity Profiler Overview(documentation)

Essential guide to using the Unity Profiler, which is critical for identifying draw call bottlenecks.

Real-Time Rendering: Draw Calls and Batching(blog)

A technical blog post that provides a good overview of draw calls and batching concepts in real-time graphics.

Unity XR Development Best Practices(documentation)

Official Unity documentation on best practices for XR development, often including performance tips.

Unity Learn: XR Performance Optimization(tutorial)

A comprehensive course on optimizing performance specifically for XR applications in Unity.