Batching的使用限制
Static Batching限制(较少)
- 额外内存开销
- 64000个顶点限制:Unity下,一旦静态合批后的对象网格顶点数超过64000个,就会自动开启下一个静态合批
- 可能影响Culling剔除的结果
Dynamic Batching限制
- 合批后的对象不能超过900个顶点属性
- 顶点属性,而不是900个顶点。如:你的基础顶点有位置、颜色、法线、UV坐标四个属性时,那么最大的顶点数就不超过900/4=225个顶点
- 除了渲染阴影对象外,相同材质,不同材质实例也不能合并
- 就是说,即使你复制了两个一模一样的材质赋给两个对象,即使材质属性内容一模一样,也不能进行动态合批
- 具有光照贴图的游戏对象如果有附加渲染器参数时,如果需要动态合批这些对象,它们必须指向相同的光照贴图位置
- 也就是要有相同的光照贴图UV才能进行动态合批
- 这个要求非常苛刻,所以大部分具有光照贴图的游戏对象很难做到动态合批
- 着色器具有多Pass的材质对象无法动态合批
- 受多个光照影响的游戏对象,即使满足动态合批条件合批后,也只会受到一个光源影响
- 延迟渲染下不支持动态合批
- CPU开销可能会增大,需要测试开启使用
GPU Instancing限制
- 需要图形API版本与Shader版本的支持
- 移动设备上需要OpenGL es3.0以上版本的支持
- GPU Instancing与SRPBatcher不兼容
- 不同绘制API的参数与绘制个数不同
- 渲染顶点数较少的网格时,效率可能会较差(测试使用)
SRP Batching限制
- 需要图形API对Const Buffer的支持
- 必须是SRP渲染管线
- Shader必须是compatible时才能生效
- 粒子对象不能做SRP Batching合批
- 使用MaterialPropertyBlocks的游戏对象不能合批
合批失败的原因汇总(Unity2022版本上最全最新)
- 这些原因一般都会显示在Frame Debug中抓取的管线信息,如下图所示的位置
- 补充:
- 1.由于要走多个灯光Pass所以不能合批
- 2.即使材质的属性数值完全相同也不行
- 3.这里的不能合批是指在Shadow Pass中的合批
- 2.对象不能进行GPU Instancing合批
- 4.这种情况主要是由于静态批次合并的网格顶点数达到64000时,即使两个对象一样,距离也临近,但还是会拆到两个批次中去
- 2.这种情况一般发生在粒子对象定义了Additional Vertex Stream时
- 5.因为这种情况它也没有对象可以合
- 4.也就是一个SRP Batcher Const Buffer内容达到最大时,会进行Flush操作,这时会自动开启下一个SRP Batcher
- 6.节点材质需要改变渲染设备状态时,会切换SRP Batcher。因为所有渲染器状态切换都会进行一个新的Set Pass Call
- 7.因为这时前面也没有任何对象进行渲染
- 8.这种情况一般是你修改了管线中默认的顶点数据结构,两个不同顶点结构的网格对象是不能进行合批的