如何读懂UWA性能报告?—UGUI篇

如何读懂UWA性能报告?—UGUI篇

UI模块是很多开发团队头疼的疑难杂症之一,它的性能和UI设计师的制作及工程师的实现息息相关,两套看上去完全一样的UI很有可能在底层设计和实现上截然不同,因此性能也大相径庭。所以我们在UWA测评报告中也提供了UI的性能分析,今天先来谈谈UGUI。

友情提示:本系列为Unity开发者通读版,力求做到人人能读懂。当然,纸上得来终觉浅,绝知此事要躬行,www.uwa4d.com等你来体验。


抛砖引例

在此,我们以一个UI性能特别出众的游戏《星辰奇缘》为例,打开UWA性能报告中的UI页面,我们能看到这里的测试指标为CPU峰值、CPU均值、堆内存分配总值、堆内存分配均值,也能在下图中查看这些参考数值随着项目运行时的走势。对于 UGUI 来说,UWA报告中主要检测 Canvas.BuildBatch 和 Canvas.SendWillRenderCanvases 两个函数,上文中的CPU峰值即指这两个函数。
请输入图片描述

该游戏在红米Note2设备上运行时的UI模块CPU开销如上图所示。UI模块总体的CPU占用均值为1.0 ms,主要集中在0.2~3.4ms范围内(5%~95%),在29000帧+的测试时间内,累积堆内存分配总值仅为1.3MB。一般来说,建议把UGUI的堆内存分配控制在3MB以内。

接下来,我们来看下UI模块的CPU走势图,报告中分别提供了CPU走势和堆内存走势。同时,当点击场景中的某一截图时,可以查看其对应的CPU耗时和这一帧上Canvas.BuildBatch 和 Canvas.SendWillRenderCanvases 分别的CPU占用是多少。
请输入图片描述
请输入图片描述

在这里,我们先来解释下这两个参数:

1、Canvas.SendWillRenderCanvases()
该API为UI元素自身发生变化(比如被Enable或者被缩放,移动并不算)时所产生的调用。发生在canvas被渲染之前。

2、Canvas.BuildBatch
该API为UI元素合并的Mesh需要改变时所产生的调用。通常之前所提到的Canvas.SendWillRenderCanvases()的调用都会引起Canvas.BuildBatch的调用。另外,Canvas中的UI元素发生移动也会引起Canvas.BuildBatch的调用。

同CPU开销一样,开发团队能在选中某一场景时,查看到其对应的堆内存以及其对应的走势。
请输入图片描述


优化支招

上文中我们分享了星辰奇缘的UI性能数据,如果你对这些数字还不算敏感,小编再PO一张平日测试中常见的UI走势图。是的,你没看错,我们看到的UI模块开销,经常是如下图一般的高开销、高占用。
请输入图片描述

接下来就需要各位程序大大结合自己的UI设计具体问题具体分析了。由于此文的目的是为了帮助大家理解UWA性能优化报告,因而并不会大篇幅讲解UGUI性能优化的细则,在此先给一些比较通用的建议:

1、对于Unity 5.x的项目,尽可能使用Unity 5.2以后的版本,UI的几何创建和合批都由多线程完成,性能明显提升。具体可参见Unity官方博客:
http://blogs.unity3d.com/cn/2015/09/07/making-the-ui-backend-faster/

2、尽可能将静态UI元素和动态UI元素分开,存放于不同的Canvas下。同时,对于不同频率的动态元素也建议存放于不同的Canvas中。

3、 严格控制一个非静态的Canvas(即Canvas中会频繁出现变换的元素)中的UI元素数量,因为Canvas中所有的UI元素都会合并到一个Mesh中,一旦某个元素发生变化,则会引起Mesh发生变化,从而造成开销。

4、 尽可能减少Mask组件的使用,使用Mask不仅会增加GPU端渲染的压力,同时也会造成CPU端DrawCall的明显上升。可尝试用RectMask2D来进行替换。

5、对UI纹理资源进行详细检测,查看其分辨率、格式等是否足够精简和优化。

补充一下,由于UI模块是优化中的难点之一,好的UI能让整个游戏的性能再上一个Level,其重要性可见一斑。那么我们的工程师是怎么优化的呢?上面那些杠杠的性能数据是怎么来的呢?小编曾见证这个过程:工程师在深度优化时会不断点击UI模块的每个按钮,分析其对应的底层性能开销是否合理,比如:切换服务器时、进入主界面时、主界面与人物界面的切换时、人物界面切换到主界面时、主界面与商城界面的切换时、商城界面切换到主界面时、战斗界面等等时,通过在各个界面的测试来统计定位出CPU开销和堆内存分配的性能瓶颈,并给出详细的优化方案。UI界面越复杂,元素越为众多,工作量越大。所以,珍惜你的程序员同事吧,他们真的不容易~

此外,我们前不久在广州站举办了一场优化开放日,并专讲了UGUI开发技巧,在此奉上PPT(点击此处),希望能对大家的开发有所帮助^_^,接下来的NGUI会另写一期,敬请关注!