关于人工智能:微信小游戏的内存调优指南

4次阅读

共计 8076 个字符,预计需要花费 21 分钟才能阅读完成。

微信小游戏开发、测试、现网三阶段的内存调优工具使用指南:

蕴含微信开发者工具,微信 Android 性能面板,PerfDog,小游戏云测试和小游戏性能助手等工具。

  1. 前言

在开发微信小游戏的过程中,开发者往往会遇到很多内存问题,如内存透露或者内存溢出等。对目前几款微信创意小游戏进行测试发现,微信小游戏运行时的异样 Crash 多是因为内存占用过多造成的。为了不便开发者调优小游戏内存,本文从开发、测试与现网不同阶段介绍咱们常见的内存剖析与调优工具。

  1. 现网数据:为什么要做小游戏内存优化?

  • 小游戏数据助手:“小游戏数据助手”是微信公布的官网小程序,反对相干的开发和经营人员查看本身小游戏的经营数据。

为了能让开发者把握游戏的运行性能数据,小游戏框架底层会对现网玩家进行肯定概率的采样,采样量能够通过趋势数据勾选失去。须要上报性能数据的玩家会以肯定工夫距离(目前为 1 分钟)上报数据,因而该数值能比拟精确地反馈玩家实在的游戏体验状况。最终这些数值会出现在小游戏数据助手提供的“性能剖析“板块。

咱们能够在左图”详情“中看到整体的内存均值与游戏因内存产生的内存异样退出率,在右图“运行性能”中看到在不同品位的机型下的内存均值与内存异样退出率。

值得注意的是,在 iOS 下小游戏与微信客户端是处于同过程,因而两者总内存达到 OOM 阈值(如上图)时非常容易被零碎 KILL 掉,因而开发者须要分外留神内存的使用量。
通过剖析,咱们发现许多小游戏在 iOS 的内存异样退出率偏高(尤其是低端机),如果你发现自己的小游戏也存在这样的景象,那么很大概率存在内存问题而导致少量玩家散失,接下来须要连忙着手优化小游戏的内存应用。

  1. 开发阶段:把所有都管制在最开始

开发过程中,为了不便凋谢者定位和调试所研发的微信小游戏的内存问题,本文举荐三款内存调试工具:

  • 微信开发者工具 Performence 与 Memory:微信开发者工具中内置了 Google Chrome DevTools 工具。DevTools 能够帮忙开发人员即时编辑页面并疾速诊断问题,最终能够帮忙开发人员更快地构建更好的小游戏。
  • 微信 Android 真机性能测试:微信 Android 端本身集成了三种内存剖析工具,别离是性能监控面板、Heap Snapshot、V8-CPU-Profile。开发者可通过三者监控 Android 真机环境下各性能指标。
  • PerfDog:挪动全平台 iOS/Android 性能测试、剖析工具平台。疾速定位剖析性能问题,晋升 APP 利用及游戏的性能和品质。手机无需 ROOT/ 越狱。手机硬件、游戏及 APP 利用也无需做任何批改,极简化即插即用。

3.1 微信开发者工具 Performence 与 Memory

如果想要具体理解微信开发者工具下的 Performance 和 Memory 的全副性能,参考 Chrome Performance 和 Chrome Memory。
截图取自微信开发者工具和 Chrome Performance。

3.1.1 微信开发者工具 之 Performance

为了更不便清晰地剖析内存问题,倡议开发者在引擎端导出微信小游戏我的项目时,选中“调试模式”。

应用 Performance 的录制步骤如下图所示(勾选上 Performance 下的 ScreenShots 和 Memory,见下图黄褐色框区域):

录制实现后会失去如下图所示的后果,对后果依照下文给出的形式进行剖析。Performance 中共有 4 个区域,起到不同的作用,接下来别离介绍。

区域 1:概览窗口

蕴含 FPS、CPU、NET、ScreenShots、HEAP 五局部。其中:

  • NET 对应区域 2 中的 Network。每个黑白条代表一个资源。条越长,检索资源所破费的工夫越长。每个栏的浅色代表等待时间(从申请资源到下载第一个字节之间的工夫)。深色局部示意传输工夫(下载第一个字节和最初一个字节之间的工夫)。
    条的色彩编码如下:

    • HTML 文件是 蓝色的
    • Scripts 是 黄色的
    • Stylesheets 是 紫色的
    • 媒体文件为 绿色
    • 其余资源是 灰色的
  • 当鼠标放在 FPS,CPU 和 NET 区域时,将显示该工夫点的页面截图。
  • HEAP 是 JS 堆的缩略展现,对应着区域 3。
区域 2 和区域 3

包含 Network、Frame、Interactions、Main、GPU、Chrome_childIOThread 和 Compositor 等七个局部,内存问题重点关注 Network 和 Main。

  • NetWork 对应着概览窗口(区域 1)中的 NET,不再赘述。
  • Main: CPU 堆栈跟踪的可视化火焰图 。显示了主线程随工夫变动的流动图表。x 轴示意一段时间内的记录,每个条形代表一个事件,较宽的条形示意该事件破费了更长的工夫。y 轴示意调用堆栈,事件互相叠加时,示意较高的事件导致较低的事件。
    入选中 Main 时,区域 3 出现了 JS Heap、Documents、节点数(Nodes)、监听器(Listeners)和 GPU memory 等变动曲线。
区域 4:统计窗口

在上述三个窗口中选中不同的区域,该窗口出现不同的统计后果。

剖析内存时次要关注 JS Heap 数据及其曲线。

如上图,曲线色彩和上方复选框的色彩保持一致,如 JS Heap 是蓝色,Listeners 是暗黄色。曲线显示了五组数据的曲线图,别离是 JS Heap(JS 堆内存),Documents(DOM 树根节点数量),Nodes(节点数),Listeners(监听器数量)和 GPU Memory。
禁用复选框能够从图表中暗藏该类别。
点击 JS Heap 曲线时,Main中会定位到对应的执行函数,对于剖析内存变动很有帮忙。

3.1.2 Chrome Devtools 之 Memory

开发者工具中的 Memory 能够帮忙你:

  • 找出您的页面以后正在应用多少内存。
  • 通过时间轴记录可视化一段时间内的内存应用状况。
  • 应用堆快照辨认拆散的 DOM 树(导致内存透露的常见起因)。
  • 应用“调配时间轴”记录找出何时在 JS 堆中调配新内存。


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。

3.1.3 Heap snapshot

Heap snapshot 有 Summary、Comparison、Containment 和 Statistics 四种视图。

  • Summary 显示按构造函数名称分组的对象。应用它能够依据构造函数名称分组的类型来查找对象(及其内存应用状况)。这对于跟踪 DOM 透露特地有用。
  • Comparison显示两个快照之间的差别。应用它能够比拟操作之前和之后的两个(或多个)内存快照。通过查看开释的内存中的增量和援用计数,能够确认内存透露的存在和起因。
  • Containment容许浏览堆内容。它提供了一个更好的对象构造视图,有助于剖析全局命名空间(窗口)中援用的对象,以找出使它们放弃不变的起因。用它来剖析闭包并从低层次深入研究对象。
  • Statistics显示了以后 js heap 各种类别的资源所占用的内存大小的统计图。
1. Summary

如下图所示:其中

  • Constructor示意应用此构造函数创立的所有对象。
  • Shallow Size显示对象自身占用的内存大小。
  • Retained Size 显示删除对象后能够开释的内存大小(依赖项不可再拜访)。这个大小其实次要蕴含了依赖项的大小。
  • Distance应用节点到根间隔的最短门路。
    开展每一行,将显示其所有实例。@字符后的数字是对象的惟一 ID,能够按对象比拟堆快照。
  • (global property) – 全局对象和其援用对象的两头对象。
  • (roots) – 援用了所选对象的实体对象。援用可能被浏览器引擎出于本身目标所创立。浏览器引擎具备援用缓存,然而这些援用都是弱援用,因而不会阻止所选对象的垃圾回收。
  • (closure) – 通过函数闭包对一组对象的援用计数。
  • (array, string, number, regexp) – 具备援用数组,字符串,数字或正则表达式的属性的对象类型的列表。
  • (compiled code) – 所有与编译代码相干的内容。
  • HTMLDivElementArrayBuffer等 – 对代码援用的特定类型的元素或文档对象的援用。
2. Comparison

通过将多个快照互相比拟来查找存在差别的对象。为了验证某个应用程序操作不会造成透露(例如,通常是一对间接和反向操作,例如关上一个文档,而后敞开它,不会留下任何垃圾),您能够遵循以下情景:

  1. 在执行操作之前,录制堆快照(take heap snapshot)。
  2. 执行一项操作(以您认为会导致透露的某种形式与页面进行交互)。
  3. 执行相同的操作(进行相同的交互并反复几次)。
  4. 拍摄第二个堆快照,并将其视图更改为“比拟”,将其与快照 1 进行比拟。
    在“比拟”视图中,显示两个快照之间的差别。开展总条目时,显示增加和删除的对象实例:
3. Containment

实质上是应用程序对象构造的“鸟瞰图”。能够通过它查看函数闭包外部,察看组成 JavaScript 对象的 VM 外部对象,以及理解应用程序在非常低的级别应用了多少内存。
该视图提供了几个入口点:

  • DOMWindow objects是代码层面的“全局”对象。
  • GC root是 VM 垃圾回收应用的理论 GC 根目录。GC 根目录能够由内置对象映射,符号表,VM 线程堆栈,编译缓存,句柄作用域,全局句柄组成。
  • native object 是 JavaScript 虚拟机外部“推送”以容许自动化的浏览器对象,例如 DOM 节点,CSS 规定。

Allocation instrumentation on timeline

录制时,请留神“调配时间轴”上是否有蓝色条状显示,如上面的屏幕截图所示。

这些蓝色条示意新的内存调配。能够缩放栏以筛选“Constructor”窗格,以仅显示在指定工夫范畴内调配的对象。
开展对象,而后单击其值查看无关它的更多详细信息。

3.2 微信 Android 真机性能测试

微信 Android 端本身集成了三种内存剖析工具,别离是性能监控面板、Heap Snapshot、V8-CPU-Profile。开发者可通过三者监控 Android 真机环境下各性能指标。
通过此工具,开发者能够监控 Android 真机环境下的各个内存指标的实时变动。

3.2.1 性能监控面板

微信 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 保持一致。

3.2.2 Heap Snapshot

微信 Android 7.0.7 版本及以上,微信为小游戏开发版和体验版提供了 Heap 内存快照的能力,同样是在胶囊按钮中关上,抉择开发调试中的 Take Heap Snapshot,在界面弹出如下图所示的提醒后,从手机中的提醒的地位把 Heap Snapshot 拷贝到电脑上。

之后在微信开发者工具中的调试器的 Memory 中,Load 拷贝出的 Heap Snapshot 文件,就能够查看 V8 的内存快照了,成果如下图所示:

3.3 PerfDog 的应用阐明

各个参数信息和应用阐明详见 PerfDog 应用阐明;
本节只精简地介绍应用 PerfDog 进行内存定位的操作。

在本文中,PerfDog 的作用在于:
(1)追踪内存变动的场景,帮忙疾速定位到内存异样的场景。
(2)从宏观角度观察微信小游戏运行时总体内存变化趋势,剖析小游戏内存的可优化空间。

3.3.1 iOS 设施应用阐明

  • Step 1:关上 PerfDog,抉择手机设施(USB 模式或者 WIFI 模式,倡议抉择 USB 模式),选定应用程序“微信”。此时能够看到右侧区域多个指标的趋势图。本文中重点关注 Memory Usage。

    为了更清晰地剖析内存变动场景,倡议在 PerfDog 中关上 ScreenShot(只反对 USB 模式):打开方式为点击右下角 ”➕”,选中 ScreenShot。如下图:
  • Step 2:在挪动设施终端关上所要测试的微信小游戏。此时失常状况下,能够看到右侧 Memory Usage 中的各个曲线发生变化。
  • Step 3:在微信小游戏的各个场景中进行游戏操作,察看右侧 Memory Usage 的变动。

    • iOS 设施下微信小游戏与微信处于同一过程,故间接察看微信过程的 Memory Usage 的变动即可。
    • iOS 设施下 Memory Usage 各字段如下。在下列指标中,定位内存问题重点关注 Memory 指标。

      • Memory:统计 FootPrint,是测试过程中重点察看的指标。

        注 1:PerfDog 临时在 iOS9、10 零碎无奈获取该字段,其余版本可失常应用。如做性能测试,倡议降级 iOS 零碎版本。
        注 2:OOM 与 FootPrint 无关,与零碎、机型无关。只与 RAM 无关,如 1G 内存机器。FootPrint 超过 650MB,引发 OOM。

      • Xcode Memory:XCode Debug gauges 统计形式。

        注:PerfDog 临时在 iOS9、10 零碎无奈获取该字段,其余版本可失常应用。如做性能测试,倡议降级 iOS 零碎版本。

      • Real Memory:Xcode Instrument 统计形式,指理论占用物理内存。

        注:该指标与物理内存零碎策略无关,掂量内存指标时不会关注,然而它有助于剖析和定位整体性能问题。比方:Memory 没有升高,阐明利用没有开释内存,然而 Real Memory 却升高了,阐明系统对内存做了压缩。因为压缩会占用 CPU 资源,相应会导致 FPS 升高。

      • Virtual Memory:虚拟内存
  • Step 4:根据 Memory 曲线变动,对照实际操作场景或者 ScreenShot 给出的场景截图,依据微信小游戏的代码逻辑,定位出内存异样的场景。

3.3.2 Android 设施应用阐明

注 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(手机界面性能数据显示),但不影响失常测试性能。

  • Step 1:关上 PerfDog,抉择手机设施(USB 模式或者 WIFI 模式,倡议抉择 USB 模式),选定应用程序“微信”。此时能够看到右侧区域多个指标的趋势图。本文中重点关注 Memory Usage。

    为了更清晰地剖析内存变动场景,倡议在 PerfDog 中关上 ScreenShot(只反对 USB 模式)和 Memory Detail:打开方式为点击右下角 ”➕”,选中 ScreenShot 和 Memory Detail。如下图:
  • Step 2:在挪动设施终端关上所要测试的微信小游戏。此时失常状况下,能够看到右侧 Memory Usage 中的各个曲线发生变化。
  • Step 3:在微信小游戏的各个场景中进行游戏操作,察看右侧 Memory Usage 的变动。

    • Android 设施下微信小游戏与微信处于不同过程,须要在 PerfDog 中选取小游戏过程。选取小游戏过程形式如下图所示:鼠标搁置在区域“1”上,会弹出右侧浮动框,其中深色区域是以后微信内沉闷的过程。如果此时微信正在运行小游戏,则该过程为微信小游戏过程。点击深色过程,即选中了小游戏过程。此时察看该过程的 Memory 变动即可。

      • Android 设施下 Memory Usage 各字段如下。在下列指标中,定位内存问题重点关注 Memory 指标。

        • Memory:PSS Memory,统计后果和 Android Java API 规范后果统一,与 Meminfo 也统一。

          注:局部三星机器零碎批改了 Meminfo 底层统计形式,导致 Meminfo 与 Java AP 统计后果不统一,新出三星机器已修复。

        • Swap Memory:局部设施反对 Swap 性能,在启用 Swap 性能后,零碎会对 PSS 内存进行压缩,Swap 减少,PSS 会相应缩小,因为压缩会占用 CPU 资源,同时相应会导致 FPS 升高。
        • Virtual Memory:VSS。
  • Step 4:根据 Memory 曲线变动,对照实际操作场景或者 ScreenShot 给出的场景截图,依据微信小游戏的代码逻辑,定位出内存异样的场景。
  1. 测试阶段:上线前的最初一道防线

小游戏云测试:小游戏云测试是微信小游戏团队为开发者提供的一套残缺易用的在线测试服务,以帮忙开发者更高效、更全面地进行自动化游戏性能测试、兼容性测试,驱动产品质量晋升和优化,为用户带来更佳的游戏体验。具备高覆盖率的真机设备集群、低成本接入门槛和继续集成性能、兼容性检测工具等特点。

欢送参加内测

4.1 内存专项数据

点击上图中的 内存报告 按钮。

能够看到内存概览、内存散布、内存 Top 列表和内存数据详情等多种统计数据。

  • 内存概览:高中低档机型下,多种内存数据(如 avg_graphic、avg_native)等的详情数据。
  • 内存散布:总内存最大值 (max_totoal) 的机器数量散布状况,次要由工作测试过程与设施条件(如屏幕分辨率,操作系统)决定。
  • 内存 TOP 列表:总内存最大值 (max_totoal) 排序 TOP5 机型。
  • 内存数据详情:total,graphic,native,private-other 的最大值与均值在各设施测试中的具体数据。

4.2 内存指标数据

在“场景概览”或者“测试设施列表”中抉择一台设施,点击“查看详情”或者“具体报告”,即可进入该设施下的云测试后果。

在具体报告中有多个指标,内存剖析可关注 内存指标曲线 ,如下图:

因为 Android 和 iOS 零碎起因,内存指标曲线上在上述两个零碎中取得的具体指标有所差别。
反对操作:

  • 鼠标搁置在曲线上某一点会浮窗显示该点的详细信息。
  • 点击“指标曲线阐明”,可显示 / 暗藏某一指标曲线。
  • 按下鼠标左键,自左向右拖动,可缩放窗口以查看指定区域信息。
  • 在曲线上鼠标点击某一点,可查看该时刻内存中的具体资源文件列表和统计图。

  • 点击“比照”,可在内存指标曲线上抉择两个时刻,比照两个时刻的内存资源文件的差别,差别文件以占用内存大小排序。
  • 点击“勾销比照“可勾销比照。
正文完
 0