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

抛砖引例

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

该游戏在红米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占用是多少。
如何读懂UWA性能报告?—UGUI篇
如何读懂UWA性能报告?—UGUI篇

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

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

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

同CPU开销一样,开发团队能在选中某一场景时,查看到其对应的堆内存以及其对应的走势。
如何读懂UWA性能报告?—UGUI篇


优化支招

上文中我们分享了星辰奇缘的UI性能数据,如果你对这些数字还不算敏感,小编再PO一张平日测试中常见的UI走势图。是的,你没看错,我们看到的UI模块开销,经常是如下图一般的高开销、高占用。
如何读懂UWA性能报告?—UGUI篇

接下来就需要各位程序大大结合自己的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界面越复杂,元素越为众多,工作量越大。所以,珍惜你的程序员同事吧,他们真的不容易~





原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。