这几天正在做一个项目,一个场景中的有大量模型,所以优化尤为重要。

 首先,我们考虑一下,性能优化是要优化什么?优化的是CPU和GPU计算资源,使得用户操作流畅,体验感好,CPU主要负责的是计算数据,帧率,GPU主要负责分辨率相关,渲染等一些东西。

 我们可以从下面几个方面着手优化:

   1.CPU --------- (1)过多的Draw Calls值;(2)复杂的脚本,脚本在Update中执行太多以及物理组件;(3)GC(垃圾回收);

   2.像素处理------(1)过多的fragment,overdraws;(2)过多的逐像素计算,图片纹理过大,分辨率过高;

   3.模型方面------(1)模型的面数和模型顶点数;

 对于CPU来说,限制它的主要是Draw Calls值,了解OpenGL吧,其实说白了就是通过位置、法线、颜色、纹理坐标,摄像机绘制图像时就需要调用Draw Call,还有模型的顶点数,太多导致法线增加,模型材质等,比如,一个场景里有山有水,我们渲染水的时候使用的是一个material以及一个shader,但渲染山的时候就需要一个完全不同的material和shader,那么就需要CPU重新准备顶点数据、重新设置shader,而这种工作实际是非常耗时的。如果场景中,每一个物体都使用不同的material、不同的纹理,那么就会产生太多Draw Call,影响帧率。

  增对上面的提出的方面,我大概总结了一下优化的方法:

 1、对于脚本语言,要逻辑清除,竟可能都分装成方法,尽量不要在Update里面写太多的功能;

 2、使用LOD(Level of detail)技术;

 3、使用遮使用遮挡剔除(Occlusion culling)技术;(Unity Taiwan有一些关于这方面的知识,讲解的特别好

http://unitytaiwan.blogspot.tw/2014/01/unity-43-occlusion-culling.html 

http://unitytaiwan.blogspot.jp/2013/12/unity-43-occlusion-culling_26.html 

http://unitytaiwan.blogspot.tw/2014/01/unity-43-occlusion-culling.html (需×××))

 4、模型的优化,尽可能的减少模型中的三角形的数目数和尽可能重用顶点;

 5、移除不必要的Hard Edge以及纹理衔接,即避免Smoothing splits和UV splits;

 6、减少光照,使用Lightmaps、GodRays;

 7、减少Draw Calls值。

 Draw calls的大小是很重要的,越大,你的工程程序就会越卡顿,Unity3D对于Draw calls的优化有两种,Unity中有两种批处理方式:一种是动态批处理,一种是静态批处理。对于动态批处理来说,好消息是一切处理都是自动的,不需要我们自己做任何操作,而且物体是可以移动的,但坏消息是,限制很多,可能一不小心我们就会破坏了这种机制,导致Unity无法批处理一些使用了相同材质的物体。对于静态批处理来说,好消息是自由度很高,限制很少,坏消息是可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动了。合并纹理,利用网格的顶点数据,有时,除了纹理不同外,还有对于不同的物体,它们在材质上还有一些微小的参数变化,例如颜色不同、某些浮点参数不同,其实,不管是动态批处理还是静态批处理,它们的前提都是要使用同一个材质。是同一个,而不是同一种,也就是说它们指向的材质必须是同一个实体。

 8、减少纹理图片的大小和像素的大小,保持纹理图片大小适中。


 这些博客写的不错:http://blog.csdn.net/candycat1992/article/details/42127811

             http://aigo.iteye.com/blog/2248378

http://ravenw.com/blog/2011/10/14/unity-optimization-of-draw-call/


总结的很详细。大家可以看一看。