Unity动态批处理和静态批处理学习

本文转自:http://blog.csdn.net/lyh916/article/details/45725499,请点击连接查看楼主大神原文,尊重楼主版权。html

参考连接:Unity圣典:http://www.ceeger.com/Script/Mesh/Mesh.CombineMeshes.htmlpost

 

1、批处理性能

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

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

3.要想使用批处理,须要物体有相同的材质。这是由于,对于使用同一个材质的物体,它们的不一样仅仅在于顶点数据的差异,咱们能够把这些顶点数据合并在一块儿,再一块儿发送给GPU,就能够完成一次批处理。3d

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

对于动态批处理,unity会自动完成,不须要咱们进行操做,并且物体是能够移动的,可是动态批处理有许多限制条件。
对于静态批处理,物体不可移动,可是限制条件不多。blog

 

2、动态批处理ip

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

限制:

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

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

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

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

 

3、静态批处理

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

优势:由于它只须要进行一次合并操做,所以比动态批处理更加高效。

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

操做:将Inspector面板右上角的Static勾选(实际上只须要勾选Batching Static便可)

 

4、DrawCall

渲染统计窗口

Batches:至关于DrawCall

Saved by batching:经过批处理节省的DrawCall

SetPass calls:跟Shader中Pass的数量有关,Pass越多这个越大

Ps:当对场景中的物体进行修改时,有时须要点击一下Game视图,渲染统计窗口才会刷新。

 

5、影响DrawCall的因素:

1.Pass数量

新建一个场景,将天空盒改成纯色,将平行光的阴影类型改成无。此时Batches值为1,当禁用相机时,值为0。


新建一个cube,新建一个材质和三个shader,其中OnePass含一个Pass,TwoPass含两个,ThreePass含三个。将OnePass给材质,材质给cube。


而后依次将TwoPass和ThreePass给材质。


能够看出,Pass越多DrawCall越大。能够经过FrameDebugger来查看DrawCall,固然也能够用Profiler,但后者不能查看DrawCall的具体状况。




2.材质

a.在场景中放三个cube,cube材质为一个pass

结论:通过动态批处理后,相同材质的物体只占一个DC


b.将上面的cube改成Capsule

结论:对于顶点数太多的物体,没法进行动态批处理,没法减小DC


c.场景放两个不一样材质的cube

结论:不一样材质的物体,没法进行动态批处理,没法减小DC


d.针对b状况,勾选Static,而后点击运行(不运行就没法查看静态批处理结果)

结论:对于顶点属性太多的物体(>900),可使用静态批处理来减小DC


合并以后的网格


e.那么对于d,再添加一个不一样材质的Sphere,勾选Static

结论:不一样材质的物体,没法经过静态批处理减小DC。可是静态批处理能够经过合并网格来提升性能。


6、合并网格

建立一个空物体,确保缩放为(1,1,1),在空物体下随便建立一些物体。Ps:要使合并后不变形,就要确保根物体的缩放比例为(1,1,1)

添加如下代码到空物体上。

 

此处请查看原文

 

 

关于CombineMeshes:

 

void CombineMeshes(CombineInstance[] combine, bool mergeSubMeshes = true, bool useMatrices = true);

结合网格有利于性能最优化。若是mergeSubMeshes为true,全部的网格会被结合成一个单个子网格。不然每个网格都将变成单个不一样的子网格。若是全部的网格共享同一种材质,设定它为真。若是useMatrices为false,在CombineInstance结构中的变换矩阵将被忽略。

相关文章
相关标签/搜索