随着UWA GOT Online功能的不断迭代,GOT Online为解决各种游戏性能问题(如内存占用、CPU耗时、GPU耗时和卡顿)提供了丰富的高效、准确且便捷的数据获取方式和分析建议。本文总结了GOT Online(SDK 2.4.7版本)中的关键优化要点,涵盖了数据获取、数据分析和性能优化等方面。不论你是哪个段位的工程师,这篇文章都是一本值得仔细研读的宝典。
阅读引导
卡 顿 优 化
卡顿分析
在卡顿点分析功能下,UWA在每帧耗时曲线中列举出了运行过程中的所有卡顿帧。选中任意卡顿点,即可在查看这一帧的详细数据。除了耗时、占比、调用次数外,在Timeline中还可以清晰地看到主线程和子线程的进程情况,便于开发者对这些异常节点的耗时情况进行详细分析。
在重点函数分析页签下,UWA对测试过程中容易发生卡顿的重点函数进行了分类和整合,开发者可以更高效地排查项目中的卡顿情况,定位卡顿原因。
>> 如何快速定位你的卡顿
>> 卡顿分析界面:重点函数分析和卡顿点分析
>> GPU Counter、Timeline功能
资源管理
在资源管理模块下,UWA列出了各个资源的加载耗时、频率情况,开发者可以准确定位到是哪个资源造成的耗时瓶颈,查看到每个资源的加载/卸载、每个GameObject的实例化/激活等具体耗时情况。
>> GOT Online Resource模式下的资源管理模块
在Resource模式下,或在Overview模式开启Resource模式时,勾选资源管理模块,即可在资源管理模块查看到AssetBundle加载&卸载、资源加载&卸载、资源实例化&激活的四大模块。
在资源管理汇总界面,UWA将需要注意的加载耗时、频率TOP 10的问题资源直接列出,通过对这些重点对象快速处理,能在短时间内达到立竿见影的优化效果。同时,也可以重点分析不同加载接口的使用情况,比如在“资源加载&卸载”界面,用户可以看到被加载的资源属于哪个AssetBundle,用了哪个接口以及加载的耗时、次数等。
GPU 优化
SoC信息
在SoC GPU信息模块下,开发者可以从更宏观的角度对设备的GPU运行情况进行监控,在观察GPU运行状态、判断是否存在GPU降频情况的同时,也可以快速定位GPU压力较大的场景,更有针对性地进一步分析这些场景的性能压力来源。
>> GPU篇:SoC GPU信息、GPU Counter性能指标
GPU Counter
经过对GPU Counter功能不断的完善和迭代,GPU Counter模块已经支持Mali、Adreno、PowerVR三个品牌芯片的设备,包括九个重要GPU参数模块。开发者可以通过GPU耗时、GPU活动来定位项目哪些场景的性能瓶颈来自GPU,并通过GPU着色、带宽、图元这些详尽的参数,更高效便捷地定位GPU压力来源、制定性能标准。
>> GPU Counter、Timeline功能
>> Mali GPU Counter模块新增GPU图元处理和GPU Shader Cycle
>> GPU Counter支持Adreno、PowerVR芯片
>> SoC GPU信息、GPU Counter性能指标
内 存 优 化
PSS显存 & 内存占用 & 资源内存
在运行信息页下的PSS内存模块中,开发者可以查看测试过程中的PSS显存数据,结合资源内存数据,对项目的闪退风险进行管控。
在内存占用页,开发者可以快速总览项目中纹理、网格、动画、音频等各类资源的内存占用情况和趋势、了解项目的内存分布,以及细分定位到哪些资源存在问题,大幅节省逐个资源排查的时间。
在资源内存页,UWA会根据测试时是否开启Resource模式、是否手动dump等情况,不同程度地展示资源的具体信息。在这个页面下,开发者可以在采集Overview模式数据的同时,也能获取到和Resource模式一样全面的资源数据。
>> PSS显存、内存占用、堆内存对象快照
>> 内存篇:PSS显存、内存占用、堆内存对象快照
>> GOT Online支持多模式采集、Mono分析支持IL2CPP打包
当测试中未开启Resource模式时,资源统计模块会统计主要场景(测试起始帧、每千帧、场景切换帧和结束帧等)中纹理、网格、Shader、字体、RenderTexture、粒子系统等主流资源的数量和大小;而当开启Resource模式后,则会对上述资源的使用详情做更详细的采集。
以纹理资源为例,开启Resource模式后,可以在报告中获取纹理资源的内存占用、数量峰值、宽度、高度、生命周期和是否开启了R/W等属性,以便开发者对纹理的使用情况做更详细地排查。
当在Overview模式下发现Mono存在问题时,就可以使用Mono模式,对Mono的分配和驻留情况进行具体分析。
多线程统计Mono分配
Mono模式除了主线程外,也可以获取到子线程的堆内存分配情况。使用Mono模式,开发者可以更全面地对项目的Mono分配和驻留进行分析,也能够更放心地使用子线程来分担主线程的性能压力。
>> 多线程统计
Mono倒序调用分析
在堆内存具体分配模块下,可以使用倒序调用分析功能对Mono分配情况进行查看。开发者可以通过这个功能,更便捷地定位到分配Mono堆内存的深层子函数,定位内存问题的瓶颈。
>> Mono堆内存倒序调用分析
驻留堆内存分配函数
在堆内存泄漏分析下,即可查看驻留堆内存分配前10位的函数。通过对两次采样间的内存变化比较,开发者可以快速地捕捉具体的泄露函数、泄露的具体内存和变量数据。
>> GOT Online新版本中暗藏的小心机
堆内存对象快照
通过堆内存对象快照,开发者可以对场景中的堆内存对象情况进行详细采样。在对场景中的Mono驻留问题有一个直观了解的同时,高效锁定Mono堆内存瓶颈,并着手优化。
>> 堆内存对象快照
“堆内存泄漏分析”中的“驻留堆内存分配函数”以及“堆内存对象快照”页,方便开发者对运行时的堆内存对象驻留情况进行详细地分析。
在测试时,根据测试开始前设置的Dump规则,在每固定间隔帧或手动Dump时,UWA会对堆内存对象进行数据采集。
开发者可以在“堆内存对象快照”页中的堆内存对象柱状图表中,从“堆内存对象大小”和“堆内存对象个数”两个维度,快速定位到哪些场景中存在需要优化的堆内存驻留问题。
堆内存对象分为Managed Object和内存碎片两部分,其中内存碎片中包含了“空闲激活内存”和“空闲碎片内存”。进行堆内存分配时,会优先使用“空闲激活内存”中可用的内存块,其次才会从“空闲碎片内存”中查找可用的内存块。
在柱状图下方,会显示选中帧所有类型的Managed Object大小、对象类型总数、对象类型个数、内存碎片占比。右侧饼状图会展示前10位和其他类型的对象和的占比,以便开发者对这一帧的堆内存对象情况有一个更直观的了解的同时,快速锁定Mono堆内存瓶颈。
同时,在饼图下方的对象类型表中,也将展示出这一帧所有对象的类型、大小、占比、对象个数等信息。在展开对象类型后,开发者就可以快速定位到调用此对象类型的所有函数和选中函数的倒序调用路径。
通过这张表格,可以更精确地定位堆内存分配的出处,并通过在代码中搜索对应的子函数,更高效地对其堆内存分配进行优化。
Lua 性 能 优 化
Lua性能分析
在Lua报告中,开发者可以看到测试时总体堆内存、堆内存具体分配和Mono对象引用的数据,开发者可以在此页签中对项目的Lua内存的分配和占用情况进行分析。
>> Lua,是时候和你走走心了!
>> UWA支持Lua CPU耗时分析
Lua倒序调用分析
Lua报告支持倒序调用分析,在倒序调用分析页下,开发者可以直接定位到最底层的Lua堆栈,一眼挑出耗时最大、分配最多的始作俑者,高效地解决问题。
>> GOT Online新版本中暗藏的小心机
在倒序模式下,某结点展开后的直接函数列表为对该结点函数有所调用、并产生堆内存的父函数,因此可以直接定位到最底层的原因,再也不用为深不见底的堆栈而无脑“点点点”了。
Mono 对象引用
在Mono对象引用模块下,开发者可以直观地查看Mono端已经被Destroy但Lua端却依然被索引的变量的对象的数量和走势,并通过对比模式将采样点做比较,更便捷地定位C#层的内存泄漏问题。
>> Lua代码优化
在任意一种Lua插件中,都存在类似的机制:在C#层维护一个Cache来引用那些被Lua访问过的C#层对象,防止出现以下的问题:当Lua中再次访问该C#对象时,该对象可能已经被C#层的GC回收掉了,从而导致逻辑错误。所以,在Lua中始终保留某个C#层对象的引用,将会导致其无法被释放,当这样的引用越来越多,就会导致C#层的内存泄漏。
为了便于用户排查这种情况,我们在Mono对象引用的报告页面中对上述的Cache中C#层对象进行了汇总,统计了Cache中出现的对象类型和各个类型的对象总数。当该对象继承自UnityEngine.Object时,还将统计该类型中已经被Destroy的对象数量,如下图所示:
所以,对于判断Lua引用导致Mono泄露的一个简单的方法就是查看Destroyed总数是否为零。因为它表示的是Mono端已经被Destroy但Lua端却依然被索引的变量总数,理论上应该是趋向于0的。如果它持续很高,甚至还有不断走高的趋势,那么很大概率是泄露了,如下图所示:
对于某些数量持续上涨的对象类型,包括Destroy数量和走势等,还可以在图表下通过对比两个不同采样点的对象引用,从而进一步定位Lua中不合理的引用,分析增量的合理性。
补充说明:关于排查泄露的需求,建议长时间测试,毕竟泄露问题一旦发生,聚沙成塔就很快了。
能 耗 优 化
功率
在耗电量页,可以查看测试过程中的功率数据。便于开发者通过观察测试过程中设备的功率和电流情况,对项目的功耗情况进行分析。
>> GPU Counter功能支持Adreno、PowerVR芯片
温度变化量
在温度变化量页,UWA支持CPU温度、GPU温度和电池温度数据,开发者可以通过这些硬件的温度情况,定位设备发热原因。
>> Mali GPU Counter模块新增GPU图元处理和GPU Shader Cycles
更 多 提 升 使 用 体 验 的 优 化 项
自定义参数
使用UWA自定义参数截取需要分析的代码,即可在自定义参数下的自定义代码段和自定义变量页对代码进行检测和跟踪后。通过这个功能,开发者可以更灵活地定位代码瓶颈和反馈代码问题。
>> 支持自定义变量和代码段检测
函数释义Tips
在Overview报告的各个模块的函数堆栈下,UWA结合结合丰富的优化经验,UWA对优化过程中的常见函数进行了标注。有了这些贴心的Tips,开发者就可以快速归因并给出整改方法,让优化的效率更上一层。
>> 对比分析、Batches数量、函数释义Tips
在Overview报告的各个模块的函数堆栈下,新增了函数释义的Tips。结合丰富的优化经验,UWA对优化过程中的常见函数进行了标注。将鼠标移动到函数名右侧的“ ! ”上,即可查看函数的释义、耗时来源、优化方式等信息。
对比分析
通过报告右侧的快捷入口,即可对Overview报告中不同的场景进行全面地对比分析。开发者可以在快速定位问题的同时,便捷且充分地在团队内部搭建起监控流程,定期对项目的性能情况进行数据汇总,形成更高效便捷的性能数据监控闭环。
>> 对比分析、Batches数量、函数释义Tips
场景分割
通过使用场景概览-场景管理下的场景分割的功能,开发者即可针对不同场景、UI 界面等模块,更精细化地统计具体场景的耗时情况,进一步为数据分析带来便利。
>> 支持资源加载分析、场景分割
可通过在“场景概率-场景管理”中点击“新增场景分割线”按钮,输入分割的位置和场景名,即可在页面上看到最新的数据分析。
更多UWA GOT Online使用技巧等待你的探索,也欢迎大家提出建议和需求!免费试用可以前往www.uwa4d.com,注册用户即可获得15天的试用权益!