参考链接:Unity圣经:
1.批处理
1.批处理的目的是减少DrawCall。 DrawCall是CPU命令GPU绘图的意思。
2. 如果我们需要渲染一千个三角形,将它们渲染成一千个单独的网格比直接渲染一个包含一千个三角形的网格花费的时间要长得多。
3. 要使用批处理程序开发,对象需要具有相同的材质。 这是因为,对于使用相同材质的物体,它们的区别只是顶点数据的不同。 我们可以将这些顶点数据合并在一起,一起发送给GPU,完成一个批处理。
4.unity中批处理有两种:一种是动态批处理,一种是静态批处理。
对于动态批处理,unity会自动完成,不需要我们操作,可以移动对象,但是动态批处理有很多限制。
对于静态批次,对象是不可移动的,但限制很少。
2.动态批处理
原理:每一帧合并可以批处理的模型网格,然后将合并后的模型数据传输给GPU,再使用相同的材质进行渲染。
限制:
1. 顶点属性要小于900个,比如shader需要用到顶点位置、法线、纹理坐标三个顶点属性,那么顶点数不能超过300个,这样模型才能动态batch。 所以,优化策略就是shader的优化,尽量少用顶点属性,或者模型顶点数越少越好。
2. multi-pass shader会打断批处理。
3、在unity5中,动态批处理对模型缩放的限制不再存在。
4. 使用浅色纹理的物体需要小心处理。 为了对这些对象进行动态批处理,需要保证它们指向光照纹理中的相同位置。
3.静态批处理
原理:只是在开始运行时,将需要静态批处理的模型合并到一个新的网格中,也就是说这些模型数据在运行时是不能移动的。
优点:因为它只需要一次合并操作,所以比动态批处理更高效。
缺点:需要更多内存来存储合并的几何体。
操作:在Inspector面板右上角勾选Static(其实只要勾选Batching Static即可)
4. 绘图调用
渲染统计窗口
Batches:相当于DrawCall
Saved by batching:通过批处理保存的DrawCall
SetPass调用:与Shader中pass的数量有关,pass越多,数量越大
Ps:修改场景中的物体时,有时需要点击Game视图,渲染统计窗口会刷新。
5、影响DrawCall的因素:
1、通过次数
新建一个场景,天空盒改为纯色,平行光的阴影类型改为无。 此时Batches值为1,禁用摄像头时,值为0。
新建一个cube,新建一个material和三个shader,其中OnePass包含一个Pass,TwoPass包含两个,ThreePass包含三个。 将 OnePass 赋予材质,将材质赋予立方体。
然后依次给素材赋予TwoPass和ThreePass。
可以看出,Pass越多3D交通工具,DrawCall越大。 可以通过FrameDebugger查看DrawCall,当然也可以使用Profiler,但是后者无法查看DrawCall的具体情况。
2.材质
A。 场景中放三个立方体,立方体材质为pass
结论:动态批处理后,相同材质的物体只占用一个DC
b. 将上面的cube改成Capsule
结论:对于顶点过多的物体,无法进行动态批处理,无法降低DC
C。 在场景中放置两个不同材质的立方体
结论:不同材质的物体无法进行动态批处理unity 天空盒动态变化,无法降低DC
d. 对于case b,勾选Static,然后点击Run(不运行是看不到静态批处理结果的)
结论:对于顶点属性过多(>900)的物体,可以使用static batching来降低DC
合并网格
e. 然后对于 dunity 天空盒动态变化,添加一个具有不同材质的 Sphere 并检查 Static
结论:不同材质的物体不能通过静态批处理降低DC。 但是静态批处理可以通过合并网格来提高性能。
6.合并网格
创建一个空物体,确保比例为(1,1,1),并在空物体下创建一些随机物体。 ps:为了合并后不变形,需要保证根物体的缩放比例为(1,1,1)
将以下代码添加到空对象。