深入了解 Unity 批处理

       DrawCall是OpenGL中描述绘制次数的一个量,例如一个基本的OpenGL绘制流程是设置颜色、设置绘图方式、顶点坐标、绘制、结束。

       目的:Unity3D使用了批处理来达到降低DrawCall的目的,批处理希望通过对物体网格的重组来获得更高的绘制效率。通俗点讲,多个物体合并成一个物体后,多个DrawCall就变成一个啦。

       条件:Unity3D中批处理要求物体的材质相同。如果有些物体使用不同的材质,那么把这些材质对应的纹理打成“图集”以后可以对其进行合并。

        方式:动态批处理和静态批处理。

一.静态批处理

       场景中相对来说“静态”的物体勾选Static选项。

       优点:静态批处理允许游戏引擎尽可能多的去降低绘制任意大小的物体所产生的DrawCall。

       缺点:需要占用更多的内存资源,因为它需要额外的内存资源来存储合并后的几何结构,在静态批处理之前,如果有几个对象共享相同的几何结构,那么将为每个对象创建一个几何图形,无论是在编辑器还是在运行时。用空间换时间的做法使内存性能和渲染性能产生了矛盾,需要抉择。

        原理:将静态对象转换为世界空间,并为它们构建一个很大的的顶点索引缓冲区。同一批中一系列的统一处理。

        静态批处理目前只支持静态批处理目前只支持Unity ios Advanced。

二.动态批处理

        要求:上万数量级别的物件用动态批处理显然是扛不住的,动态批处理通过将所有物体的顶点转换为CPU上的世界空间来工作,所以它只能在渲染Draw Call的工作量小于CPU顶点转换工作量的时候,才会起到提高性能的作用。

        注意:

        1、 批处理动态物体需要在每个顶点上进行一定的开销,所以动态批处理仅支持小于900顶点的网格物体。

        2、 动态批处理只适用于包含小于900个顶点属性的网格。如果你的着色器使用顶点位置,法线和UV值三种属性,那么你只能批处理300顶点以下的物体;如果你的着色器需要使用顶点位置,法线,UV0,UV1和切向量,那你只能批处理180顶点以下的物体。

        3、 不要使用缩放尺度(scale)。分别拥有缩放尺度(1,1,1)和(2,2,2)的两个物体将不会进行批处理。

        4、 统一缩放尺度的物体不会与非统一缩放尺度的物体进行批处理。使用缩放尺度(1,1,1)和 (1,2,1)的两个物体将不会进行批处理,但是使用缩放尺度(1,2,1)和(1,3,1)的两个物体将可以进行批处理。

        5、 使用不同材质的实例化物体(instance)将会导致批处理失败。

        6、拥有lightmap的物体含有额外(隐藏)的材质属性,比如:lightmap的偏移和缩放系数等。所以,拥有lightmap的物体将不会进行批处理(除非他们指向lightmap的同一部分)。

        7、 多通道的shader会妨碍批处理操作。比如,几乎unity中所有的着色器在前向渲染中都支持多个光源,并为它们有效地开辟多个通道。

        8、预设体的实例会自动地使用相同的网格模型和材质。

参考:https://blog.csdn.net/qinyuanpei/article/details/48262583

           http://gad.qq.com/article/detail/31482

 

你可能感兴趣的:(Unity,Unity,Shader,优化)