静态合批
一般合批的对象是场景中不能动的物体,静态物体,并且在inspector界面勾选上static选项;Unity预先组合静态GameObjects的网格,然后将组合的数据发送到GPU,但单独渲染组合中的每个网格,静态合批不会减小drawcall,只是减少了渲染状态的改变次数。Unity仍然可以单独筛选网格,但每次绘制调用都不会占用大量资源,因为数据的状态永远不会改变。在Unity开启Static Batching,依次点击 Edit > Project Settings > Playe->Other Settings->enable Static Batching。对于Unity使用静态合批的具体要求可以参照官方文档
支持静态合批的Unity渲染管线:默认渲染管线、URP(通用渲染管线)、HDRP、SRP。
在运行时,通过脚本使用静态合批:Unity提供了运行时,通过脚本使用静态合批口:StaticBatchingUtility.Combine,这是一个静态方法,通过这种方式调用静态合批,就不需要在编辑器的inspector界面勾选上Static选项。
static Batching缺点与限制:使用静态合批会增加内存!,因为使用静态合批,需要在内存中存储合成的几何体数据;如果多个GameObject使用了相同的网格数据,Unity会为每一个GameObject创建一个网格副本,这就意味着相同的几个数据有可能会出现多次!所以如果内存过大,就尽量避免使用静态合批。对于每一次静态合批,顶点数的限制时64000,如果超过这个值,Unity就会再次创建另外一个批次(Batch)。
动态合批
动态合并在满足以下条件时时自动完成:
- 模型总顶点属性数小于 900。例如,材质的shader使用了位置、法线、UV坐标,那么顶点数就是900 / 3 = 300,如果使用了vertex position, vertex normal, UV0, UV1, 和 vertex tangent,那么顶点数量的限制就是 900 / 5 = 180;
- 不包含镜像 transform 改变。 不改变 Scale。
- 如果使用动态 lightmap 需要指定正确。
- 不使用多 Pass 的 Shader。
- 不修改材质球
由于需要在合并时通过 CPU 计算转为世界坐标,这项技术只在 CPU 消耗比 DrawCall 消耗“便宜”时才值得。这个衡量标准会根据平台产生差异,例如苹果平台上 DrawCAll的消耗便宜,就不应该使用这项技术。这个功能可以在 Editor–> Project Setting –>Player 中进行设置打开与关闭。