type
Post
status
Published
date
Jun 8, 2026
slug
batching
summary
tags
Unity
SRP
category
知识总结
icon
password
前言
SRP Batcher 和 GPU Instancing 都是 Unity 用来降低渲染 CPU 压力的优化手段,但它们优化的方向不同。
- SRP Batcher:不一定减少 Draw Call,而是让每个 Draw Call 更便宜。
- GPU Instancing:把大量相同 Mesh 和 Material 的物体合并成更少的 Draw Call。
这两者不是简单的替代关系,而是适合不同的渲染场景。
SRP Batcher
SRP Batcher 是什么
SRP Batcher 是 Scriptable Render Pipeline 中的 CPU 优化机制。
它的核心作用是减少 Unity 在提交 Draw Call 时反复设置 Shader 数据的成本。
在普通渲染流程中,每绘制一个物体,CPU 都需要向 GPU 设置一批状态和数据,例如:
- Object Transform
- Material 参数
- Shader 常量
- 渲染状态
如果场景中有大量物体,即使 GPU 还能轻松画出来,CPU 也可能因为频繁提交 Draw Call 而成为瓶颈。
SRP Batcher 会缓存兼容 Shader 的 Material 数据,让 Unity 在连续绘制相同 Shader Variant 的物体时,避免重复做大量 CPU 设置工作。
可以这样理解:
SRP Batcher 的特点
特性 | 说明 |
是否减少 Draw Call | 通常不减少 |
优化目标 | 降低每个 Draw Call 的 CPU 成本 |
是否要求相同 Mesh | 不要求 |
是否要求相同 Material | 不严格要求 |
主要条件 | Shader 必须兼容 SRP Batcher |
适合场景 | 大量普通物体,使用兼容的 SRP Shader |
Shader 如何兼容 SRP Batcher
Shader 中的材质属性需要放在正确的 Constant Buffer 里。
材质相关属性应该放入
UnityPerMaterial:这样 Unity 才能稳定缓存 Material 数据。
如果材质属性散落在不同位置,或者没有使用符合 SRP Batcher 规则的布局,Shader 就可能无法被 SRP Batcher 优化。
MaterialPropertyBlock 与 SRP Batcher
MaterialPropertyBlock 可以让每个物体在不创建新 Material 的情况下拥有不同属性,例如不同颜色。但在 SRP Batcher 中,它通常会破坏 batching。
原因是 SRP Batcher 依赖稳定的 Material 数据缓存,而
MaterialPropertyBlock 引入了每个对象不同的材质属性,使 Unity 不能简单复用缓存。所以:
如果大量相同物体需要不同颜色,更适合考虑 GPU Instancing。
GPU Instancing
GPU Instancing 是什么
GPU Instancing 是一种把多个相同 Mesh 和相同 Material 的物体合并绘制的技术。
它适合这样的场景:
- 很多相同的球
- 很多相同的树
- 很多草
- 很多石头
- 很多重复的场景道具
这些物体的 Mesh 和 Material 相同,但 Transform、颜色或其他实例属性不同。
GPU Instancing 会让 CPU 一次提交一批实例数据,然后由 GPU 根据 Instance ID 绘制多个对象。
可以这样理解:
GPU Instancing 的特点
特性 | 说明 |
是否减少 Draw Call | 会减少 |
优化目标 | 合并大量相同物体的绘制 |
是否要求相同 Mesh | 要求 |
是否要求相同 Material | 要求 |
是否允许不同 Transform | 允许 |
是否允许不同颜色 | 允许,需要 Instanced Property |
适合场景 | 大量重复物体 |
GPU Instancing 的 Shader 要点
Shader 需要显式支持 Instancing。
常见代码结构包括:
顶点输入中需要 instance ID:
顶点函数中设置 instance ID:
如果 Fragment 阶段也要访问实例属性,需要从 Vertex 传递到 Fragment:
定义实例属性:
访问实例属性:
在 Custom RP 代码侧,还需要允许绘制设置启用 Instancing,例如:
对比
SRP Batcher vs GPU Instancing
对比项 | SRP Batcher | GPU Instancing |
核心目标 | 降低 Draw Call 的 CPU 成本 | 减少 Draw Call 数量 |
Draw Call 数量 | 通常不变 | 明显减少 |
是否要求相同 Mesh | 不要求 | 要求 |
是否要求相同 Material | 不严格要求 | 要求 |
是否适合重复物体 | 可以,但不是最优 | 非常适合 |
是否适合普通场景物体 | 很适合 | 不一定 |
和 MaterialPropertyBlock 的关系 | 通常冲突 | 常用于传实例属性 |
SRP Batcher 更像是优化普通渲染流程的基础设施。
它不强求物体完全相同,只要 Shader 结构兼容,就可以减少 CPU 设置 Shader 数据的成本。
GPU Instancing 更像是专门处理“大量重复物体”的技术。
它要求 Mesh 和 Material 相同,但可以让每个实例有不同的位置、旋转、缩放和实例属性。
所以两者不是简单替代关系,而是适合不同场景。
使用选择
优先使用 SRP Batcher 的情况
- 场景里有很多普通物体
- Mesh 不同
- Material 可以不同
- 使用同一套兼容 SRP Batcher 的 Shader
- 不需要大量 per-object 材质属性
优先使用 GPU Instancing 的情况
- 场景里有大量重复物体
- Mesh 相同
- Material 相同
- 每个实例只是 Transform 或颜色不同
- 例如草、树、石头、子弹、装饰物、重复道具
Dynamic Batching
Dynamic Batching 是什么
Dynamic Batching 是 Unity 的一种运行时合批技术。
它的核心思想是:在 CPU 端把多个很小的 Mesh 临时合并成一批,然后用更少的 Draw Call 提交给 GPU。
可以这样理解:
它确实可以减少 Draw Call,但代价是 CPU 需要额外处理顶点数据。
Dynamic Batching 的特点
特性 | 说明 |
是否减少 Draw Call | 会尝试减少 |
优化位置 | CPU 端运行时合并小 Mesh |
是否要求相同 Material | 通常要求 |
是否适合复杂 Mesh | 不适合 |
主要代价 | CPU 需要每帧处理和变换顶点数据 |
适合场景 | 顶点数很少的小物体,例如简单 cube、小碎片、小装饰物 |
Dynamic Batching 的限制
Dynamic Batching 不是免费的,也不是所有物体都能合批。
常见限制包括:
- Mesh 顶点数不能太多。
- 物体通常需要使用相同 Material。
- Shader Variant 需要一致。
- 复杂 Shader 或额外顶点属性会降低合批可能性。
- 不适合高细分球体、角色模型、复杂道具。
- 透明物体还会受到排序影响。
所以在 Catlike Coding 的 Draw Calls 章节中,如果用球体测试,Dynamic Batching 很可能看不到效果,因为球体顶点数太多。
如果换成简单 cube,则更容易看到 Dynamic Batching 生效。
在 Custom RP 中开启 Dynamic Batching
Custom RP 中可以在
DrawingSettings 里打开 Dynamic Batching:通常会在 Render Pipeline Asset 中暴露一个开关:
然后在渲染时传给 CameraRenderer。
Static Batching
Static Batching 是什么
Static Batching 是 Unity 针对静态物体的合批技术。
它的核心思想是:如果一些物体在运行时不会移动、旋转、缩放,Unity 可以提前把它们合并成更大的批次,减少运行时 Draw Call。
可以这样理解:
Static Batching 比 Dynamic Batching 更适合场景建筑、地面、墙体、固定道具等不会移动的对象。
Static Batching 的特点
特性 | 说明 |
是否减少 Draw Call | 会减少 |
优化位置 | 提前或加载时合并静态物体 |
是否要求物体静态 | 要求,物体需要标记为 Static |
是否要求相同 Material | 通常同 Material 才能有效合批 |
主要代价 | 会增加内存占用 |
适合场景 | 不会移动的场景物体,例如建筑、墙面、地面、固定装饰物 |
Static Batching 的代价
Static Batching 的主要问题是内存占用。
因为 Unity 为了合批,可能会复制和重组 Mesh 数据。场景中静态物体越多,占用的内存可能越高。
所以 Static Batching 适合用在:
- 物体确实不会动。
- 这些物体的 Draw Call 成本值得优化。
- 内存开销可以接受。
不适合用在:
- 会移动、旋转、缩放的物体。
- 需要频繁启用禁用或改变材质状态的物体。
- 内存非常敏感的平台或场景。
Dynamic Batching vs Static Batching
对比项 | Dynamic Batching | Static Batching |
合批时机 | 运行时每帧尝试 | 提前或加载时处理 |
适合对象 | 很小的动态 Mesh | 不会移动的静态物体 |
CPU 成本 | 有运行时 CPU 成本 | 运行时成本较低 |
内存成本 | 相对较低 | 可能增加内存占用 |
限制 | 顶点数限制明显 | 物体必须静态 |
四种 Batching 的整体理解
技术 | 核心作用 | 是否减少 Draw Call | 适合对象 |
SRP Batcher | 降低每个 Draw Call 的 CPU 设置成本 | 通常不减少 | 大量普通物体,使用兼容 SRP Shader |
GPU Instancing | 一次绘制大量相同 Mesh 和 Material 的实例 | 会减少 | 大量重复物体,例如草、树、石头 |
Dynamic Batching | CPU 运行时合并很小的 Mesh | 会尝试减少 | 顶点数很少的小物体 |
Static Batching | 提前合并不会动的静态物体 | 会减少 | 建筑、地面、墙体、固定道具 |
参考
- Catlike Coding Custom SRP 第二章:Draw Calls
- 本文整理自学习 Custom RP 时对 SRP Batcher 和 GPU Instancing 的理解。


