Loading
S7ARRY_SPACE
0%
INITIALIZING
Album Cover
焚蝶
铁痕电台
0:00
Xiaohongshu
Batching 总结
DOC_ID // 379fd5ONLINE

Batching 总结

2026-6-8
UPDATED: 2026-6-10
知识总结
2478 CHARS
#UNITY#SRP
S7ARRY
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 的理解。
NAVIGATION // Related Articles
Loading...