先抛砖引例
我们以《六龙争霸》在三星 S3上的数据为例,打开渲染模块的界面,我们可以看到更详细的性能数据,如下图所示:
我们能在该模块中看到以下这几个参数:
1.DrawCall数量
每次引擎准备数据并通知GPU的过程称为一次Draw Call。在没有进行拼合的情况下,这一过程是逐个物体进行的,对于每个物体,不只GPU的渲染,引擎重新设置材质/Shader也是一项非常耗时的操作。因此每帧的Draw Call次数是一项非常重要的性能指标。目前,我们建议DrawCall的主体范围(5%~95%) 控制在[0,150]范围内。
降低Draw Call的方法则主要是减少所渲染物体的材质种类,并通过Draw Call Batching 来减少其数量。感兴趣的朋友可以查看我们之前的博文和Unity官方文档:优化CPU篇。
2.Triangle
这个不用多说了,面片数过高会影响渲染效率。这里需要说明的是,此处的面片数量并不是当前帧场景模型的面片数,而是当前帧所渲染的面片数,其数值不仅与模型面片数有关,也和渲染次数相关。例如:场景中的网格模型面片数为1万,而其负载的Shader拥有2个渲染Pass,或者有2个相机对其同时渲染,那么此处所显示的Triangle数值将为2万。
3.不透明和半透明渲染
不透明物体和半透明物体的渲染,几乎是所有项目最为耗时的部分。一般来说,在移动游戏项目中,半透明物体渲染开销均要大于不透明物体的渲染开销,即紫色曲线是要高于蓝色曲线的。对于半透明渲染的开销,大家需要主要关注三个地方:UI界面、粒子系统和半透明场景物体(花草、光束等)。而如果你的项目恰巧不透明渲染较高(常见是MMO游戏),那么你需要尝试简化场景中的不透明模型网格、动态加载超大地形了。
需要说明的是,以上几个参数的CPU耗时需要结合具体场景查看。我们可以点开分析&建议,看下主要范围(5%~95%)内的数值。
此外,UWA测评报告中将Draw Call、Triangle和蒙皮网格的数量趋势图排放在一起,从它们的数量分布趋势、再结合对应帧数的场景图,推测出影响性能开销的主要原因。
并且,选中某一帧后,我们能在UWA的报告中看到具体的截图,就很容易定位当时的场景了:
如何优化,请看“分析 & 建议”
由于每个项目的情况各不相同,这里简单总结几点,对于渲染模块的优化,通常我们建议开发团队从以下几点入手:
1、简化场景和模型的相关资源
可以尝试使用Asset Store中的SimpleLOD、Simplygon等简化工具来对网格模型进行简化,从而进一步加快渲染的效率,如果可以,建议蒙皮网格降低到1500面以下,场景渲染面片峰值低于10万面。
另外,在大量的移动游戏中,其渲染资源其实是“过量”的,过量的网格资源、不合规的纹理资源等。所以,在UWA测评报告中对资源的使用进行了详细的展示(网格资源的顶点属性、纹理资源的分辨率等具体使用情况),也能帮助大家快速查找和完善存在问题的资源。
2、粒子系统
粒子系统是目前大量项目中半透明渲染耗时较高的“罪魁祸首”。如果咱们的项目半透明渲染较高,一定要重点查看粒子系统的渲染开销。一般来说,我们建议将粒子系统的渲染开销主体范围(5%~95%)控制在0~3ms范围内。该模块在UWA性能报告中另设有专门板块,我们将在以后的专题中讲解。同时,在Unity 5.3版本以后,引擎将这部分开销放到了子线程进行处理,这一做法很酷!
3、根据某些高耗时的函数来优化
某些大量渲染的函数,如查看Camera.Render等 。这些函数可以在代码效率中查看,并通过堆栈信息查阅到具体的调用情况。
4、根据手机机型的不同采用不同的渲染LOD
比如低端机(红米2)上使用更为简单的材质,从而来降低低端设备的GPU压力。
好了,渲染模块报告的参数说明先到这里啦,希望简单易懂。不过呢,渲染模块由于是重中之重,如果平日里大家有什么相关的疑惑或者QA,我会陆续补充在这里的,也谢谢大家的真知灼见咯!
原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。