2D 渲染组件合批规则说明
合批条件说明
2D 渲染组件合批的规则是节点的 layer、使用的材质、渲染组件的 blendState 和 DepthStencilState 相同、贴图源以及贴图采样都相同才会进行合批。 下面我们就分别说明一下这些条件:
- 节点的 layer:由于 layer 会涉及到渲染与否,所以不同的 layer 之间不能进行合批
- 材质:材质相同是合批的必然要求,由于我们使用的材质实例化的机制,所以用户在设置了材质的 uniform 之后材质会进行实例化,实例化之后的材质是无法进行合批的,如果自定义材质进行了 uniform 设置之后导致此组件无法合批,之后 uniform 值使用完毕想要该组件参与合批,可将材质资源重新赋值给组件即可重新使组件参与合批(通过 CustomMaterial 接口赋值即可)
- BlendState 状态:对于部分 2D 渲染组件可以在面板上设置部分的 BlendState 值,这个值不同的话是无法进行合批的
- DepthStencilState 状态:这个值控制着组件的深度检测和模板缓冲,一般来说用户不需关心这个值的设置,这个值由引擎自动控制(用于 Mask 的效果实现)
- 贴图源和贴图采样:一般来说,这个条件是影响合批的最主要的条件,尤其对于精灵和文本来说,贴图很容易产生差别导致无法合批。引擎提供了部分方法来实现更好的合批,可参考后文。
合批方法说明
结合以上的合批条件说明,我们可以通过一些方法来实现更好的合批方法,需要额外说明的是,2D 渲染组件的渲染数据采集是一个基于节点树的渲染方式,而一些组件是会打断合批的,目前引擎的内置组件 Mask,Graphics, UIMeshRenderer 由于材质不同和数据组织方式的差异会无法与其他组件合批,而 TiledMap,Spine 和 DragonBones 这三个中间件组件遵循自己的内部合批机制,所以上述组件都无法合批,且会打断其他组件合批,需要用户进行分模块管理节点树布局,以达到更好的合批效果。