微信小游戏开发、测试、现网三阶段的内存调优工具使用指南: 包含微信开发者工具,微信Android性能面板,PerfDog,小游戏云测试和小游戏性能助手等工具。
在开发微信小游戏的过程中,开发者往往会遇到很多内存问题,如内存泄漏或者内存溢出等。对目前几款微信创意小游戏进行测试发现,微信小游戏运行时的异常Crash多是由于内存占用过多造成的。为了方便开发者调优小游戏内存,本文从开发、测试与现网不同阶段介绍我们常见的内存分析与调优工具。
为了能让开发者掌握游戏的运行性能数据,小游戏框架底层会对现网玩家进行一定概率的采样,采样量可以通过趋势数据勾选得到。需要上报性能数据的玩家会以一定时间间隔(目前为1分钟)上报数据,因此该数值能比较准确地反应玩家真实的游戏体验情况。最终这些数值会呈现在小游戏数据助手提供的“性能分析“板块。
我们可以在左图”概况“中看到整体的内存均值与游戏因内存产生的内存异常退出率,在右图“运行性能”中看到在不同档次的机型下的内存均值与内存异常退出率。
值得注意的是,在iOS下小游戏与微信客户端是处于同进程,因此两者总内存达到OOM阈值(如上图)时非常容易被系统KILL掉,因此开发者需要格外注意内存的使用量。 通过分析,我们发现许多小游戏在iOS的内存异常退出率偏高(尤其是低端机),如果你发现自己的小游戏也存在这样的现象,那么很大概率存在内存问题而导致大批玩家流失,接下来需要赶紧着手优化小游戏的内存使用。
开发过程中,为了方便开放者定位和调试所研发的微信小游戏的内存问题,本文推荐三款内存调试工具:
如果想要详细了解微信开发者工具下的Performance和Memory的全部功能,参考Chrome Performance 和 Chrome Memory。 截图取自微信开发者工具和Chrome Performance。
为了更方便清晰地分析内存问题,建议开发者在引擎端导出微信小游戏项目时,选中“调试模式”。
使用Performance的录制步骤如下图所示(勾选上Performance
下的ScreenShots和Memory,见下图黄褐色框区域):
录制完成后会得到如下图所示的结果,对结果按照下文给出的方式进行分析。Performance中共有4个区域,起到不同的作用,接下来分别介绍。
包含FPS、CPU、NET、ScreenShots、HEAP五部分。其中:
包括Network、Frame、Interactions、Main、GPU、Chrome_childIOThread和Compositor等七个部分,内存问题重点关注Network和Main。
在上述三个窗口中选中不同的区域,该窗口呈现不同的统计结果。
分析内存时主要关注JS Heap数据及其曲线。
如上图,曲线颜色和上方复选框的颜色保持一致,如JS Heap是蓝色,Listeners是暗黄色。曲线显示了五组数据的曲线图,分别是JS Heap(JS 堆内存),Documents(DOM树根节点数量),Nodes(节点数),Listeners(监听器数量)和GPU Memory。 禁用复选框可以从图表中隐藏该类别。 点击JS Heap曲线时,Main中会定位到对应的执行函数,对于分析内存变化很有帮助。
开发者工具中的Memory可以帮助你:
Memory的Profiles一共有三种类型: Heap snapshot: 显示了当前时刻页面上的js 对象和对应的DOM节点。 Allocation instrumentation on timeline: 以时间轴的形式展现出来的js heap。 Allocation sampling: JS heap的采样,多用于长时间的记录。(本文不作介绍) 此外,还可以采用Performance中的memory的方式来获取内存信息,其记录的js heap与memory基本一致,但是有一点需要注意的是, Heap snapshot记录的是干净的内存(GC后的),而Performance中记录的内存并不一定经过了GC。
Heap snapshot 有 Summary、Comparison、Containment和Statistics四种视图。
如下图所示:其中
通过将多个快照相互比较来查找存在差异的对象。为了验证某个应用程序操作不会造成泄漏(例如,通常是一对直接和反向操作,例如打开一个文档,然后关闭它,不会留下任何垃圾),您可以遵循以下情形:
本质上是应用程序对象结构的“鸟瞰图”。可以通过它查看函数闭包内部,观察组成JavaScript对象的VM内部对象,以及了解应用程序在非常低的级别使用了多少内存。 该视图提供了几个入口点:
录制时,请注意“分配时间轴”上是否有蓝色条状显示,如下面的屏幕截图所示。
这些蓝色条表示新的内存分配。可以缩放栏以筛选“Constructor” 窗格,以仅显示在指定时间范围内分配的对象。 展开对象,然后单击其值查看有关它的更多详细信息。
微信Android端自身集成了三种内存分析工具,分别是性能监控面板、Heap Snapshot、V8-CPU-Profile。开发者可通过三者监控Android真机环境下各性能指标。 通过此工具,开发者可以监控Android真机环境下的各个内存指标的实时变化。
微信 Android 7.0.7 版本及以上,微信为小游戏开发版和体验版提供了性能监控面板,可以通过胶囊按钮-开发调试-打开性能监控面板打开,效果如下图所示:
开发者可通过在Android真机中实时地监控整个游戏过程中的各项资源的变化,更直接地定位和发现内存问题。
开发者可以监控不同内存的占用情况,通过不同内存的变化趋势来判断是否有内存泄漏的情况,各个指标含义如下:
名称 | 含义 |
---|---|
summary.native-heap | native 内存 |
summary.system | 系统内存 |
summary.total-swap | 总 swap 内存 |
summary.graphics | 显存 |
summary.java-heap | java 内存 |
summary.total-pss | 总内存 |
summary.private-other | 其他私有内存 |
summary.code | 静态代码,资源内存 |
summary.stack | 栈内存 |
"内存"指总内存,其值与summary.total-pss保持一致。
微信 Android 7.0.7 版本及以上,微信为小游戏开发版和体验版提供了Heap 内存快照的能力,同样是在胶囊按钮中打开,选择开发调试中的 Take Heap Snapshot,在界面弹出如下图所示的提示后,从手机中的提示的位置把 Heap Snapshot 拷贝到电脑上。
之后在微信开发者工具中的调试器的 Memory 中,Load 拷贝出的Heap Snapshot 文件,就可以查看 V8 的内存快照了,效果如下图所示:
各个参数信息和使用说明详见PerfDog使用说明; 本节只精简地介绍使用PerfDog 进行内存定位的操作。
在本文中,PerfDog的作用在于 : (1)追踪内存变化的场景,帮助快速定位到内存异常的场景。 (2)从宏观角度观察微信小游戏运行时总体内存变化趋势,分析小游戏内存的可优化空间。
为了更清晰地分析内存变化场景,建议在PerfDog中打开ScreenShot(只支持USB模式):打开方式为点击右下角"➕",选中ScreenShot。如下图:
注1: Android设备需要开启手机USB调试模式及允许USB应用安装 注2:针对Android设备有两种模式,非安装模式和安装模式。 a. 非安装模式(推荐):手机即插即用,无需任何设置及安装,使用非常简单,但手机屏幕上没有实时性能数据显示。测试时,PerfDog会弹框警告,但不影响使用,警告信息如下:
b. 安装模式:需要在手机上自行安装PerfDog.apk,手机屏幕上有实时性能数据显示(需要允许USB应用安装和PerfDog悬浮窗管理权限),启动PC端PerfDog,则会在手机上自动PUSH安装PerfDog.apk,具体安装类似各个手机厂商安装第三方APP提示安装即可。(注:由于很多手机安装需要账号密码,导致无法自动安装,如果自动安装失败,则会把安装文件PerfDog.apk释放到当前文件夹里,手动安装PerfDog.apk即可)。此模式下,在测试过程中,可能由于系统资源紧缺会kill PerfDog显示app(手机界面性能数据显示),但不影响正常测试功能。
为了更清晰地分析内存变化场景,建议在PerfDog中打开ScreenShot(只支持USB模式)和Memory Detail:打开方式为点击右下角"➕",选中ScreenShot和Memory Detail。如下图:
小游戏云测试:小游戏云测试是微信小游戏团队为开发者提供的一套完整易用的在线测试服务,以帮助开发者更高效、更全面地进行自动化游戏性能测试、兼容性测试,驱动产品质量提升和优化,为用户带来更佳的游戏体验。具备高覆盖率的真机设备集群、低成本接入门槛和持续集成性能、兼容性检测工具等特点。
欢迎参与内测
点击上图中的内存报告按钮。
可以看到内存概览、内存分布、内存Top列表和内存数据详情等多种统计数据。
在“场景概览”或者“测试设备列表”中选择一台设备,点击“查看详情”或者“详细报告”,即可进入该设备下的云测试结果。
在详细报告中有多个指标,内存分析可关注内存指标曲线,如下图:
因为Android和iOS系统原因,内存指标曲线上在上述两个系统中获得的具体指标有所差异。 支持操作:
,可在内存指标曲线上选择两个时刻,对比两个时刻的内存资源文件的差异,差异文件以占用内存大小排序。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。