作者:徐森, 腾讯 WeTest UPA 团队测试开发 高级工程师
商业转载请联系腾讯 WeTest 获得授权,非商业转载请注明出处。
原文链接:http://wetest.qq.com/lab/view/375.html
WeTest UPA是 WeTest 和 Unity 联合出品的一款 Unity 游戏性能优化的工具,自上线以来受到了很多 Unity 游戏开发人员和测试人员的关注,同时也有一些用户反馈不知道应该如何解读 UPA 报告,下面我们对 UPA 报告的解读方法进行总结,帮助大家最大化利用 UPA 报告,解决游戏性能问题。
在正式开始前,需要强调一点,由于游戏的 Development 版本本身会对游戏的性能产生一定影响,所以 UPA 报告中的性能数据只能作为性能优化的参考,不能用来衡量游戏的真实性能。如果需要测试游戏真实的性能情况,可以使用 WeTest 助手的通用测试功能,对游戏最终上线的版本进行测试。
打开一份 UPA 报告时,最先看到的就是概述页面,这也是我们推荐用户第一时间关注的页面。概述页面一开始会列出测试的基本信息,并根据腾讯游戏的性能标准,给出本次测试的结果(通过,不通过和警告):
接下来,会列出本次报告详细的性能数据:
一般来说,游戏的性能问题主要有两方面:帧率和内存。帧率分为 CPU 耗时和 GPU 耗时,内存问题分为游戏逻辑内存(在 Unity 游戏中即 Mono 内存)和资源内存。
上述的详细性能数据都包含其中:帧率反映 CPU 耗时和 GPU 耗时情况,ReservedMono 内存反映游戏逻辑内存情况,纹理资源、网格资源、动画资源和音频资源反映资源内存情况,DrawCall 和 Tris 反映 GPU 耗时情况。通过上述数据,用户可以大概知道游戏的性能问题出在哪方面。
除了详细数据以外,UPA 还结合 Unity 现场支持专家们的经验,对常见问题进行了总结,并在报告中自动进行分析:
针对这些问题,我们也总结了相应的优化建议:
根据提供的优化建议,用户可以快速的解决一些常见性能问题。另外,我们的问题库及经验库也会不断更新优化,带给用户更多实用的优化经验。
通过概述页面,我们可以大致了解到游戏的性能数据,出现的性能问题,以及对应的优化建议。但只有这些是不够的,如果性能问题比较复杂,就需要更详细的数据帮助我们定位及优化,下面就来看看 UPA 提供的详细性能数据有哪些。
CPU 模块主要提供了 CPU 耗时相关的详细数据。在定位 CPU 相关性能问题时,我们可以从两方面入手:
1、整体耗时
如果游戏的整体帧率都比较低,需要重点关注某个模块或者某个函数是否一直耗时较高,首先,看一下模块耗时:
游戏的 FPS 均值 13.71 较低,同时渲染模块耗时(RenderingTime)一直较高,可以尝试优化渲染相关性能。其次,我们也可以看一下耗时排名 Top10 的模块,并尝试优化:
2、单帧耗时
如果游戏整体帧率正常,偶尔卡顿的话,就需要关注单帧耗时较高的帧。通过下图可以方便找到单帧耗时较高的情况:
针对耗时较高的帧,查看该帧详细的模块耗时情况:
模块耗时可以展开,查看模块间的调用关系,并最终确定导致单帧耗时较高的模块。
由于有些模块属于引擎内部模块,用户可能不太清楚其具体作用,我们也对一些模块的作用进行了说明:
图形模块反映了渲染耗时情况,并通过一些指标侧面反映了 GPU 的压力。在渲染导致游戏卡顿时,需要重点关注图形模块。
1、模块耗时
UPA 提供了一些渲染相关的模块耗时信息,通过这些信息我们可以判断游戏的摄像机使用是否合理,以及 Shader 相关的耗时是否较高:
Camera.Render 模块反映了游戏过程中摄像机的数量和渲染耗时。
Shader 相关模块反映了 Shader 处理的耗时。
2、合批
除了摄像机和 Shader 方面的优化,合批也是图形优化中非常重要的一点。由于 GPU 是单独的硬件,其性能消耗较难采集,因此一般用一些性能指标间接反映 GPU 的压力情况,最典型的就是 Drawcall(Unity5.0 以后改为 SetPasscall)指标。在 Unity 引擎中对 Drawcall 最直接的优化方法就是合批(Batch)。
合批又分为静态合批(StaticBatch)和动态合批(DynamicBatch),其原理就是把 GPU 的压力分一些到 CPU 或内存,因此开启合批会带来额外的 CPU 或内存消耗,需要我们进行权衡。
以静态合批为例,UPA 会列出开启静态合批以后节省的 Drawcall 数量(图中黄线部分),并以总 Drawcall 数量作为背景进行比较,用户可以清晰看出开启静态合批以后带来的收益,以此决定是否进行合批。
3、其他数据
除了上述数据意外,UPA 还提供了每帧的 VBO、面数等渲染指标,方便有经验的用户利用这些指标进行渲染性能优化:
内存模块反映了游戏各方面的内存占用情况,首先我们需要关注游戏整体的内存占用:
Total Reserved 表示引擎分配的内存,Total Used 表示引擎实际使用的内存,两者的差值(图中红线部分)表示空闲的内存。通过上图我们可以知道引擎分配内存是否在合理范围,空闲内存是否较多。
如果引擎分配内存较大,或者空闲内存较多,都是不合理的,这时就需要知道问题出在哪个部分,Unity 引擎分配的内存分为四个部分,在 UPA 报告中都以曲线展示:
1、Unity
这部分表示引擎本身逻辑需要使用的内存,资源内存也包含在其中,如果需要进行优化,建议直接优化资源方面的内存,UPA 中列出了纹理、网格、动画、音频和材质等资源的内存占用,可以针对性进行优化(以纹理资源为例):
2、Mono
Mono 内存表示游戏中脚本分配的内存,游戏逻辑由开发人员自己编写,并且一般比较复杂,因此较容易出现内存问题(虽然 Mono 本身提供了垃圾回收机制,但仍然可能出现内存泄漏)。
对于 Mono 内存,我们需要关注总内存 Reserved 及空闲 Unused,防止内存泄漏。
3、GfxDriver 和 Fmod
GfxDriver 和 Fmod 内存分别表示 Unity 底层渲染模块和音频模块的内存,GfxDriver 内存较高的话建议对 Shader 和 Texture 等资源进行优化,Fmod 内存较高的话建议对 AudioSource 和 AudioClip 等资源进行优化。
4、Profiler
这部分表示 Unity Profiler 分配的内存,不会带到上线版本,在确认内存占用情况时需要去除该部分内存。
在 UPA 报告中,展示了游戏的整体性能情况,并针对常见的性能问题提供了问题列表及优化建议。对于 CPU 耗时和 GPU 耗时部分提供了详细的性能数据,包括各模块耗时,以及各种渲染指标,用户可以利用这些详细性能数据定位并优化游戏的性能问题。
在内存方面,UPA 提供了各部分的内存曲线,使用户可以了解各部分内存分配情况,但是对于详细定位及优化问题还缺少关键数据。针对内存优化中最常见的资源内存优化及 Mono 内存优化,UPA 分别提供了资源测试和 Mono 内存测试类型,帮助大家获取更详细的内存数据,更方便的优化内存问题。
UPA—— 一款针对 Unity 游戏/产品的深度性能分析工具,由腾讯 WeTest 和 unity 官方共同研发打造,可以帮助游戏开发者快速定位性能问题。旨在为游戏开发者提供更完善的手游性能解决方案,同时与开发环节形成闭环,保障游戏品质。
点击链接:http://wetest.qq.com/cube/ ,下载 WeTest 助手 APP ,立即使用 UPA。