批处理

1.批处理的目的就是为了减少DrawCall。DrawCall即CPU命令GPU去绘制。

2.如果需要渲染一千个三角形,那么把它们按一千个单独的网格进行渲染所花费的时间远大于直接渲染一个包含了一千个三角形的网格。

3.要想使用批处理,需要物体有相同的材质。这是因为,对于使用同一个材质的物体,它们的不同仅仅在于顶点数据的差别,我们可以把这些顶点数据合并在一起,在一起发送给GPU,就可以完成一次批处理。

4.在unity中,有两种批处理:一是动态批处理,二是静态批处理。

对于动态批处理,unity会自动完成,不需要我们进行操作,而且物体时可以移动的,但是动态批处理有许多限制条件。

对于静态批处理,物体不可移动,但是限制条件很少。

动态批处理

原理:每一帧把可以进行批处理的模型网格进行合并,再把合并后模型数据传递给GPU,然后使用同一个材质对其渲染。

限制:

1.顶点属性要小于900。例如,如果shader中需要使用顶点位置、法线和纹理坐标这三个顶点属性,那么要想让模型能够被动态批处理,他的顶点数目不能超过300。因此,优化策略就是shader的优化,少使用顶点属性,或者模型顶点数尽可能少。

2.多Pass的shader会中断批处理

3.在unity5中,动态批处理对于模型缩放的限制已经不存在了

4.使用光照纹理的物体需要小心处理。为了让这些物体可以被动态批处理,需要保证它们指向光照纹理中的同一个位置。

静态批处理

原理:只在运行开始阶段,把需要进行静态批处理的模型合并到一个新的网格中,这意味着这些模型数据不可以在运行时被移动。

优点:因为它只需要进行一次合并操作,因此动态批处理更加高效

缺点:需要占用更多的内存来存储合并后的几何结构。

操作:将Inspector面板右上角的Static勾选(实际上只需要勾选Batching Static即可)

 

按照叠层顺序处理:

叠层顺序是按照Hierarchy中的顺序从上往下进行的,也就是越靠上的组件,就会被画在越底部。

 

图集Batch规则:

计算层级号的算法:如果有一个UI元素,它所占的屏幕范围内(通常是矩形),如果没有任何UI在它的底下,那么它的层级号就是0(最底下);如果有一个UI在其底下且该UI可以和它Batch,那么它的层级号与底下的UI层级一样;如果有一个UI在其底下但无法与它Batch,那么它的层级号为底下的UI层级+1;如果有多个UI都在其下面,那么按前两种方式遍历计算所有的层级号,其中最大的那个作为自己的层级号。

合并批次:如果相邻间的两个批次正好可以Batch的话就会进行Batch。

 

Z轴的影响

Unity以Canvas为单位进行绘制,按照前两条规则,当遍历列表进行处理时,如果列表中有x元素Z轴不为0,则处理会被打断,x元素之前的归为一个处理批次,x元素以及x元素之后的元素归为一个处理批次。

举例:列表{A,B,C,D,E,F}中C的Z轴不为0,那么从C开始被打断,列表的处理被强行拆分为两个列表{A,B}和{C,D,E,F}。

 

Text优先级高于Image

按照上面的规则,ImageA层级号为0,ImageB层级号为1(ImageA和ImageB可以Batch),TextC层级为0。

绘制顺序为TextC,ImageA,ImageB(FrameDebugger中为两个DM)