URP shaders and CPU rendering cost
Unity SRP Batcher: How It Works and How to Check Compatibility
Check your shaders and renderers, understand batch breaks, and verify the CPU work the SRP Batcher is intended to reduce.
Screenshots: Unity 6000.0.62f1 · URP 17.0.4 · macOS Metal. A small demonstration scene illustrates the controls and rendering mechanisms. Editor timings are not device benchmarks. Click any screenshot to enlarge it.
SRP Batcher reduces CPU setup work for compatible draws
Unity's Scriptable Render Pipeline Batcher keeps material data persistent and processes compatible rendering submissions efficiently. Its purpose is to reduce CPU overhead. It does not combine all participating meshes into one draw call, so unchanged draw-call counts do not by themselves indicate failure.
Unlike automatic GPU instancing, compatible content can use different materials with the same shader variant. The methods have different requirements and optimize different submission work. Read Unity's SRP Batcher explanation for the mechanism.
SRP Batcher belongs to Scriptable Render Pipelines such as URP and HDRP, rather than the Built-in Render Pipeline. The steps here use Unity 6.0 with URP 17.0.4. Check the equivalent settings for another pipeline and version.
Step 1: check the active pipeline asset
Identify the URP asset used by the active Quality Level, including any override in Project Settings > Quality, rather than editing an unused asset in the Project window. Select that asset and inspect its Rendering section.
When the control is hidden, open the section's More (⋮) menu and select Advanced Properties. Then check SRP Batcher. Unity documents both enabling the batcher and showing advanced URP properties.
Keep the initial configuration for your baseline. If you compare the option on and off later, remember that the asset affects every renderer using it. A global switch can change unrelated parts of the scene, so start by inspecting one suspicious shader or renderer when possible.
Step 2: check both shader and renderer compatibility
Select the shader asset used by a candidate material and inspect its SRP Batcher status. In the demonstration, Unity's imported URP Lit shader reports compatible. Check the shader actually used in the selected rendering event, including its pass and variant.
For a hand-written shader, Unity requires its built-in engine properties in UnityPerDraw and its material properties in UnityPerMaterial. Use the pipeline's supported shader conventions and includes. This illustrative fragment groups ordinary material values; it is not a complete shader:
CBUFFER_START(UnityPerMaterial)
float4 _BaseColor;
float _Smoothness;
CBUFFER_END
Keep texture and sampler declarations outside that constant buffer. Maintain a consistent material layout across passes. After editing, compile the shader and inspect the status again instead of assuming that adding the buffer name fixed every requirement.
Compatibility also depends on the renderer. Unity's documented path supports suitable mesh and skinned-mesh content, but excludes renderers using MaterialPropertyBlock. Check scripts as well as asset Inspectors; runtime property overrides may not be obvious from the material alone. See shader and GameObject compatibility.
Property blocks can be useful in a deliberate instancing workflow, but that does not make them free for SRP Batcher content. Review the API limitations before replacing material ownership patterns.
Step 3: inspect actual SRP batches and their boundaries
Open Window > Analysis > Frame Debugger and enable it for the relevant camera or target. Select an SRP Batch event. Read its Draw Calls field and shader information, then inspect adjacent events to understand the boundaries.
Read Batch cause as an explanation of why the selected event could not join the previous SRP event. A boundary can arise from a different shader variant or incompatible content. The first event also has a boundary by definition; its cause is not automatically a defect to fix.
Compare the active keywords and passes before merging materials or disabling features. A shader's total number of possible variants is different from the sequence of active variants in this frame. Reduce needless variation only when the desired visual behavior remains clear.
The instanced event is useful context, not a verdict that instancing is faster. It proves that the selected cubes used that mechanism. The event information reference explains the fields; use the instancing guide to compare that workflow deliberately.
Step 4: compare CPU rendering cost on the target device
Disable Frame Debugger, connect the Profiler to a representative Player and record the same route. Keep camera, quality settings, materials, coverage and instance counts fixed. Investigate CPU work involved in preparing and submitting rendering, alongside GPU timing where supported and visual output.
If you compare SRP Batcher enabled and disabled, record that as the sole intended variable and repeat both runs. A small difference within ordinary variation is inconclusive. Avoid collecting one frame from an empty view and another from a busy view.
Draw-call counts may remain similar because this mechanism targets CPU setup rather than mesh merging. Compare the intended cost instead of requiring a lower counter. If GPU shading dominates, further batch work may not improve total frame time. The diagnosis workflow helps choose the next experiment.
Common SRP Batcher problems
| Symptom | Inspect | Focused action |
|---|---|---|
| SRP Batcher control is missing | Active pipeline asset and advanced properties. | Expose the Rendering section's advanced controls. |
| Custom shader is incompatible | Material and engine constant buffers across its passes. | Fix the layout, compile and recheck the shader status. |
| Shader is compatible, renderer is excluded | Runtime MaterialPropertyBlock use and renderer type. | Review that renderer's data path before changing the whole asset. |
| Many small SRP batches | Active variants, keywords, passes and ordering. | Remove an unnecessary split while preserving the intended visuals. |
| Draw count did not fall | CPU preparation cost and actual SRP events. | Judge the mechanism by timing, not a mesh-merging expectation. |
Use draw calls and batching to distinguish the other submission methods and their trade-offs.
Frequently asked questions
What does SRP Batcher do in Unity?
It reduces CPU overhead for preparing and submitting compatible rendering work by keeping material data persistent and processing suitable draws efficiently. Draw calls remain separate.
Can SRP Batcher use different materials?
Yes. Compatible materials using the same shader variant can participate in an SRP batch. Sharing one exact material is not the same requirement as automatic GPU instancing.
Why does MaterialPropertyBlock break SRP Batcher compatibility?
Unity's SRP Batcher compatibility rules exclude renderers using MaterialPropertyBlock. Inspect runtime code as well as the shader; a compatible shader does not guarantee that every renderer uses the batcher.
Does SRP Batcher work in the Built-in Render Pipeline?
No. It belongs to Scriptable Render Pipelines such as URP and HDRP. This guide's asset and Inspector steps use Unity 6.0 with URP 17.0.4.
Should I disable SRP Batcher to enable GPU instancing?
Only consider that as a controlled comparison with a representative workload. Disabling it in a pipeline asset affects the renderers using that asset. First verify the selected path and compare a narrower experiment where possible.
Sources and version notes
Official Unity 6.0 documentation, checked October 4, 2026. Match the documentation version to your project.
Continue the investigation · A 7 Wolves tool
Investigate the shader workload behind the batches
GPUSight connects shader and material groups to scene contributors and provides static shader-source and variant investigation. Source complexity indicators are heuristics; Frame Debugger and target-device profiling remain the checks for the active path and its cost.