# 3D动态合批

# 功能介绍

小游戏框架绘制场景的过程中,每有一个MeshRenderer,便会为其中每一个 SubMesh 生成一次DrawCall。在场景中物体过多的情况下,渲染开销会变得很大。

如果场景中有许多材质相同的小物体,可以考虑开启3D动态合批来加速渲染。

开启3D动态合批后,会消耗 CPU 性能,来减轻 GPU 负担,将材质相同的物体合成一个DrawCall。

# 使用限制与潜在使用场景

并不是任何场景下使用3D动态合批都能达到优化的效果。事实上,大部分情况下打开3D动态合批都只会产生负优化

首先请确保场景中有许多物体使用了同一个材质,并且这些物体都是一些不太复杂的物体(顶点数很少)。

其次请确保这些物体并不都使用同一个模型,如果3D动态合批的物体都使用同一个模型,那么请使用GPU实例化来代替,会得到更好的性能。

最后,使用3D动态合批的最佳场景是,合批的物体都是动态物体,每帧可能会变更位置。如果合批的物体全都是静态物体,那么将场景物体进行**静态合批会获得更好的效果。由于小游戏框架现在尚未提供静态合批辅助工具,开发者可以选择使用3D动态合批来代替,或者寻找第三方静态合批工具。

# 使用方法

# 一、打开动态合批开关

所有想要进行动态合批的MeshRenderer组件上,勾选dynamicBatch选项。

# 二、控制合批的物体的渲染顺序

需要手动确保3D合批的物体,是在一个批次渲染的,批次内不能有其他无法合批的物体插入。

场景内物体的渲染顺序是靠材质上的renderQueue来控制的,相同renderQueue的物体会放在一个批次绘制。所以想让3D合批的物体在一个批次渲染,需要手动修改他们的材质(应该都是同一个),把renderQueue设置为不同于场景中任何其他物体的值。

# ▌多 SubMesh 的情况

就算MeshRenderer上有多个SubMesh,也可以进行3D动态合批。只要确保使用不同的材质的SubMesh,具有不同的renderQueue即可。

# 与 GPU 实例化的区别

GPU实例化要求模型相同,性能也高于3D动态合批。