前言
ugui中合批是什么?为什么要合批?
个人理解
ui展示到屏幕需要经过渲染DrawCall才能显示。什么是DrawCall?cpu向gpu发送的一条渲染指令就是一次DrawCall。每一次DrawCall都会对cpu造成负担,因此从性能优化的角度而言,DrawCall的次数应该尽可能的少。
批处理是指渲染时,将相同材质shader和相同贴图texture的3D模型网格合并在一起,成为一个大网格,然后调用一次DrawCall。所以合批就是在ugui中的某个Canvas下满足合批规则的ui元素网格进行合并,然后调用一次DrawCall(ugui中的组件都是网格组成的,以后再谈)。
合批
unity编辑器内的显示
如图
Game场景下的“Stats”相关内容,红框所圈的“Batches”就是此时场景内的批处理次数,也就是我们需要减少的内容。
UGUI合批的规则
引入深度depth的概念,在一个Canvas下,它对应的子物体都有depth。
在Hierarchy中,Canvas本身为根节点自上到下遍历所有元素:
1.不参与渲染的元素深度为-1(alpha=0,长宽=0,处于RectMask2D组件下等)。
2.当前需要渲染的元素下面没有和其他元素的网格重叠(下面,是指SiblingIndex值比当前元素小的元素,在Hierarchy中是当前元素的上面),depth=0。
3.只与一个元素重叠,则分两种情况:当前元素可以和下面的元素合批(材质shader相同、纹理texture相同),则depth等于下面元素的depth;不可合批,depth=下面元素.depth+1;
4.与多个元素重叠,等于下面元素的最大depth(可以合批)或者最大depth+1(不能合批)
终于,通过这些规则后得到一个叫做VisiableList的队列,剔除队列中depth=-1的元素,再进行一次排序,先按照depth从小到大、如果depth相同再按照materialID从小到大、如果materialID再按照textureID从小到大(textureID相同最后按照hierarchy中的顺序)。
最后的最后,检查VisiableList中,如果有相邻元素的material和texture完全一样(此时不考虑depth),则进行合并。
补充
如何查看网格
如图在Scene场景,点击红框内图片,并选择第二或者第三种ShadingMode即可查看