欢迎加入Unity业内qq交流群:956187480
一:Batching批处理须知
1.如果多个对象使用了同一个材质,则unity会一次性将使用了同一材质的对象绘制信息传递给GPU
进行批处理,这极大减少了CPU和GPU之间的频繁交互,所以在开发过程中尝试要让多对象共用同一材质
2.批处理所需的操作均由unity自动完成,无需我们开发人员参与,我们在这里需要了解的只是如何配合Unity3d引擎完成这些工作,这些内容对提高性能有很大的帮助
二:批处理unity设置
Edit→Project Settings→Player中勾选Static Batching静态合批和Dynamic Batching动态合批复选框,项目默认都是自动勾选的
静态批处理:
1.空项目默认会有2次Batches(天空盒和相机),创建一个模型后会增加2次,模型的网格Mesh和模型的material
2.设置模型为静态Static后,会发现bactches的次数减少了,主要是mesh被合并了
3.如果材质不同,就会发现这个材质会增加一次Batches,就只会把mesh合并处理
总结:
1.静态物体的Mesh Filter会自动生成一个新的Mesh,如果有相同材质 Shader 并且参数一致的话,就会合并DrawCall
2.静态合批的最大顶点数是65535,如果定点数超过了它,Unity就会自动合并出多个Mesh。
4.另外运行游戏后合并过的Mesh 对象是不可以发生位移的,但是可以移动他们指定的Root节点。
5.可以利用脚本来动态设置需要合并在一起的游戏对象,游戏对象不需要选中Static标记。
隐患需要注意:
自动的静态合批用起来很方便,但是也是有隐患。加入场景很大,合并出来的Mesh就会很大。游戏运行后只要有一小部分出现在摄像机内,那么整个大的Mesh都需要参与渲染,所以就需要开发人员自定义处理以及最大定点数的限制。静态合批的原理就是自动生成Mesh,但是不同的Mesh保存的信息可能是不同的。例如Mesh中可能会保存color 和 tangent,但是大部分Mesh都是不需要这个信息的,如果静态合批中有一个Mesh包含了这个信息,那么合并后整个Mesh都会带上它,这样无疑会增加一些额外的开销。所以最好是在美术层面就杜绝这类问题的出现
动态批处理
1.动态批处理无需开发人员设置,unity自动处理,且只对Mesh顶点小于300的有效,如果Shader中使用了顶点位置 法线 UV0 UV1 和切线,Mesh的定点数必须小于180。(在粒子特效中它发挥了很大的优势)。
2.以下情况不进行动态批处理
a.分别拥有缩放尺度(1,1,1)和(2,2,2)的两个物体将不会进行批处理。不要使用缩放尺度(scale)。
b.拥有LightMap的对象由于多出了一个光照烘焙材质所以这些对象也不会被进行批处理,
c.接受了阴影的的对象也是不会被批处理的
d.包含多个渲染通道pass的Shader着色器也一样
欢迎加入Unity业内qq交流群:956187480