在游戏开发过程中会经常和美术打交道,像场景、UI这些美术资源往往会造成很大的性能损失,所以了解场景优化的相关知识和置顶相应的美术规范就必不可少。而据经验而谈,优化后的场景比没优化的场景,性能能提升十倍甚至更多,下面我们就来谈一谈性能优化。
Unity场景中模型尽量公用同一张贴图,而一个场景中贴图数尽量保持在十张以内,贴图的大小尽量为1024*1024,目的是为了减少SetPass calls的数量。
Unity贴图禁止使用dds格式的贴图,在某些移动平台是不支持的,同时名称只能是因为字母数字和下划线。
场景中模型看不到的面要删除掉,场景中同屏的模型面数控制在8000以内。
模型制作完成导出时,检查模型的法线,导出时要打组导出而不是合并导出,同样时为了减少同屏面数。
Unity模型方面可以查看Statistics中的数据,具体是Tris(三角面数)、Verts(定点数)、SetPass calls(Draw Call)数据。
上图是unity 5中的空场景,现在的三角面数有1.7k,这是因为场景中的天空盒子的面数导致的。将Lighting面板中的天空盒子去掉。
可以看到现在的三角面和定点数就为2和4,这是场景中摄像机占两个三角面。同时场景中的实时灯光也会增加SepPass calls值,而我们通常会通过场景的灯光烘焙来降低这个值。
将场景中的模型勾选static选中,场景的lighting面板中的Preconputed Realtime GI取消勾选,Baked GI勾选,点击烘焙,这样我们就能把场景的灯光关闭掉,减小SepPass calls值。
现在场景中有4个模型,每个模型有一个单独的贴图,可以看到SepPass calls值为4,加入场景中有上千个模型,每个模型有不同的贴图,同屏幕的情况下这个值也得100以上,这会很影响效率的。现在将这四个模型的贴图放在一张贴图上观察。
可以看到SepPass calls值为1,所以优化的话就将模型的贴图都合并起来。究其原因是cpu将每个贴图的信息放在buffer中,gpu去从中读取进行渲染,这样的一个数据写入的过程是因为cpu在每次写入时候会花大量的时间去执行写入数据前的准备工作,这样就会导致cpu在写入,而gpu在等待数据,造成了性能的浪费。比如1个10M的文件复制时间,远远小于100个1k的文件的速度,也是这个原因。
一个场景中有许多的灯光,包括大概两个平行光,若干个点光源,当然也可以在场景中设置灯光的数量,在QualitySettings面板的不同的等级设置不同的灯光数量,做一下相关的优化。
也可以在Lighting面板中设置Ambient Source(环境光)设置亮度和颜色,让整个场景有个基础的亮度值。
接下来在场景中的模型物体,全部勾选static,shader中不是金属材质的选择Shader(Specular Setup),RenderingMode的渲染属性有四种,Opaue(不透明),Cutout(透明但没有半透明)、Fade(整体透明)、Transparent(只有像素透明,高光没有透明化)。一般来说房子使用Opaue,植物使用Cutout。
Lighting中Ambient Source(环境光),取消勾选Percomputed Realtime GI(实时GI),勾选Baked GI(烘焙GI),Baked Resolution(烘焙质量)谁知为5,Compressed(压缩勾选),勾选Fog(雾),最后点击烘焙就可烘焙出环境光贴图。
现在场景相关的优化技巧都介绍完了,重点就是模型的面要尽量的少,用贴图去丰富模型的细节,模型的贴图尽量合并成一张贴图,场景的灯光同样去烘焙,这样是可以减小SetPass Calls次数,提高渲染的性能。