The 3D Handbook
Key term

Draw calls

A request from the CPU to the GPU to draw something; their number, driven by objects and materials, often limits performance before triangles do.

performanceoptimisationmaterialsinstancing

A draw call is a request from the CPU to the GPU to draw something. Meta's developer documentation puts it plainly: "each object rendered requires the app to send information about how to draw the object" to the GPU through the graphics driver (Meta Horizon Developers: WebXR Performance Optimization Workflow).

The cost of that request is mostly paid by the CPU and is "largely independent of the complexity of the object being rendered" (Meta Horizon Developers: WebXR Performance Optimization Workflow). So a scene of many small objects can be slow even when its triangle count is low.

#Draw calls as a performance limit

Meta gives an example: submitting 1,000 individual triangles as separate draw calls "would likely cause your app to run at less than 72 frames per second because of CPU cost" on Quest, while the GPU "can easily render several orders of magnitude more triangles" (Meta Horizon Developers: WebXR Performance Optimization Workflow). On platforms like this, the draw call count is often the first budget you hit. See polygon and triangle budgets.

Published targets give a sense of scale:

Platform Recommended draw calls per frame Source
Meta Quest 2 under 100 (Meta Horizon Developers)
Meta Quest 3 under 200 (Meta Horizon Developers)
PC VR (Rift, PC SDK guidance) 500–1,000 maximum (Meta Horizon Developers)

#Materials and draw calls

The CPU cost of a draw also grows with render state changes, such as switching shaders and textures (Meta Horizon Developers: WebXR Performance Optimization Workflow). Objects can be batched into a single call when they share a material (Meta Horizon Developers: WebXR Performance Optimization Workflow). As a result, every different material is something that cannot be batched with its neighbours, and a mesh with several material slots cannot be drawn as one batch either.

This is why environment workflows favour trim sheets, texture atlases, tileable materials and material instances: they let many meshes share one material.

#Ways to reduce draw calls

Left, a grid of 40 small boxes each in a different shade, labelled 40 materials, 40 or more draws. Right, the same 40 boxes in two shades, with repeated shapes grouped, labelled 2 shared materials plus instancing, a handful of draws.
Unique materials stop the engine from batching. Shared materials and instancing let the same room be drawn in far fewer calls. Counts are illustrative.Diagram by the handbook author

#Draw calls with Nanite

Unreal's Nanite runs in its own rendering pass that "bypasses traditional draw calls" (Unreal Engine Documentation: Nanite Virtualized Geometry). At the UE5 reveal, Epic promised no more "draw count budgets" (Unreal Engine blog: A first look at Unreal Engine 5). Brian Karis reports Nanite handling "a million instances easily" (SIGGRAPH 2021: Nanite: A Deep Dive).

The costs move elsewhere. Instance data still takes memory: 457 MB for the transforms of 10 million instances (SIGGRAPH 2021: Nanite: A Deep Dive). Nanite meshes are limited to Opaque and Masked materials (Unreal Engine Documentation: Nanite Virtualized Geometry), and masked materials in Nanite "incur a significant cost during base pass shading" (Unreal Engine tech blog: Bringing Nanite to Fortnite Battle Royale in…). Material count and complexity still matter for shading even when draw calls do not.

#Common mistakes

  • Optimising triangles when draw calls are the problem. Profile first; see performance and profiling.
  • One material per prop by default. Ask whether the prop could use the kit's trim sheet.
  • Separate materials for tiny details. A screw with its own material costs a draw call wherever the prop appears.
  • Merging across rooms. It breaks culling, as noted above.

polygon and triangle budgets, level of detail, overdraw, trim sheets, texture atlases, master materials and instances, modular kits, performance and profiling, virtualised geometry.

#Further reading and watching

References

  1. Meta · WebXR Performance Optimization Workflow · Meta Horizon Developers, 2026 · docs · accessed 2026-10-20
  2. Meta · Device Optimization Comparison · Meta Horizon Developers, 2026 · docs · accessed 2026-10-20
  3. Meta · Performance Guidelines (PC SDK) · Meta Horizon Developers, 2026 · docs · accessed 2026-10-20
  4. Epic Games · World Partition - Hierarchical Level of Detail · Unreal Engine Documentation, 2026 · docs · accessed 2026-10-20
  5. Simplygon / Microsoft · Hierarchical Level-Of-Detail (Simplygon 10.4) · Simplygon Documentation, 2026 · docs · accessed 2026-10-20
  6. Epic Games · Nanite Virtualized Geometry · Unreal Engine Documentation, 2026 · docs · accessed 2026-10-20
  7. Epic Games · A first look at Unreal Engine 5 · Unreal Engine blog, 2020 · article · accessed 2026-10-20
  8. Brian Karis · Nanite: A Deep Dive · SIGGRAPH 2021, Advances in Real-Time Rendering in Games, 2021 · talk · accessed 2026-10-20
  9. Epic Games · Bringing Nanite to Fortnite Battle Royale in Chapter 4 · Unreal Engine tech blog · article · accessed 2026-10-20

Last updated 2026-10-22