合批处理在UGUI中会有一些不同
先获得一个按Hierarchy的顺序的列表
计算每个物体的深度。
1 深度从0开始递增。如果世界包围盒Z轴不为0(或isCanvasInjectionIndex),则需独占一个批次,同时独占一个深度。即等于之前所有物体最大深度+1,后一个物体深度需要+1。
2 对一般物体的深度。会判断是否可跟之前的物件共享深度,走接下来的流程。
2.1 先按格子(默认大小是120,根据包围盒再计算)划分出多个格子。(只是为了加速求交)。
2.2 计算物体包围相交哪些格子,再跟格子中已有的物体进行包围盒相交判断。如果不相交则使用当前深度;如果相交且可合批,则使用相交物体中最大的深度;如果相交且不可合批,则使用相交物体中最大的深度+1。合批条件:无独占批次+材质相同+贴图相同+裁剪开关和裁剪矩形相同+贴图A8格式一致(kTexFormatAlpha8)
2.3 将该物体加入所有相交的格子中。若遇到独占深度的物体,则格子数据清空。即后续物件不跟之前的物件共享深度。
排序:按照深度-材质-贴图-层级顺序优先级排序。
合批:对排序后的列表,从头开始一个一个检测是否能与前面的物体合批。合批条件:无独占批次(只判断isCanvasInjectionIndex)+材质相同+贴图相同+裁剪开关和裁剪矩形相同+贴图A8格式一致(kTexFormatAlpha8),非SubBatch只判断前两个条件,一般情况下UI的材质都一样。
UGUI批处理原文链接:httpsblog.csdn.nethankangwenarticledetails122667647
在Unity中的shader中会将这些数据存到一些通道里: POSITION、NORMAL、COLOR、 TANGENT、TEXCOOR
UgUI合批de注意事项
首先合批的 原理: 同一Canvas下 同一材质 同一图片或者是图集
Ugui的排序
首先Ugui的排序渲染方式 canvas 的渲染层级 UI的深度渲染层级 index深度 材质的渲染层级 hierarchy次序(textureID 排序)
ugui都是先进行排序 后进行合批
排序的顺序取决于 index深度(box是否遮盖的关系) 材质ID textureID 排序
建议:
- 所有有可能打断和皮的层移动到最下边图层,避免UI元素重叠
- 拆分多个同级或者嵌套的canvas,减少canvas的rebatch复杂度
- 动静分离
- canvas 尽量使用overlay模式减少camera的性能开销