微信小游戏的内存调优指南

由来:https:// ** .testwo.com/

1. 引言

在开发设计h5小游戏的历程中,开发者通常会遇上许多内存问题,如内存泄露或是内存外溢等。对现阶段几种手机微信创意小游戏开展检测发觉,h5小游戏运作时的出现异常Crash多是因为内存占有太多导致的。为了更好地便捷开发者调优游戏内存,文中从开发设计、检测与gsm网络不一样环节详细介绍大家常用的内存剖析与调优专用工具。

2. gsm网络数据信息:为什么要做游戏内存提升?

小游戏数据小助手:“小游戏数据助手”是手机微信公布的官方网微信小程序,适用有关的开发设计和经营工作人员查询本身游戏的运营数据。

为了更好地能让开发者把握手机游戏的运作性能数据信息,小游戏框架最底层会对gsm网络游戏玩家完成一定几率的取样,采样量可以根据发展趋势数据信息启用获得。必须汇报性能数据信息的用户会以一定间隔时间(现阶段为1分鐘)汇报数据信息,因而该标值能非常精确地反映游戏玩家真实游戏感受状况。最后这种标值会展现在小游戏数据小助手带来的“性能剖析“版块。

我们可以在下左图”概述“中见到总体的内存平均值与手机游戏因内存造成的内存出现异常撤出率,在下图“运作性能”中见到在差异级别的型号下的内存平均值与内存出现异常撤出率。

特别注意的是,在iOS下游戏与pc版微信是处在同过程,因而二者总内存做到OOM阀值(如上图所述)时很容易被系统软件KILL掉,因而开发者必须非常留意内存的需求量。

根据剖析,大家发觉很多游戏在iOS的内存出现异常撤出率较高(尤其是低端机),假如你察觉自己的游戏也存有那样的状况,那麼非常大几率存有内存问题而造成大量游戏玩家外流,下面必须赶快下手提升游戏的内存应用。

3. 设计阶段:把一切都把控在最初

开发设计流程中,为了更好地便捷对外开放者精准定位和调节所开发的h5小游戏的内存问题,文中强烈推荐三款内存调节专用工具:

手机微信开发者专用工具Performence与Memory:手机微信开发者专用工具中自带了Google Chrome DevTools专用工具。DevTools可以协助开发者及时编写网页页面并迅速检测问题,最后可以协助开发者迅速地搭建更快的游戏。

手机微信Android 真机性能检测:手机微信Android端本身集成化了三种内存分析工具,分别是性能监管控制面板、Heap Snapshot、V8-CPU-Profile。开发者可根据三者监管Android真机自然环境下各性能指标值。

PerfDog:挪动全服务平台iOS/Android性能检测、分析工具服务平台。迅速精准定位剖析性能问题,提高APP使用及网络游戏的性能和质量。手机上不用ROOT/苹果越狱。手机硬盘、手机游戏及APP运用也不用做一切改动,极简单化1394连接。

3.1 手机微信开发者专用工具Performence与Memory

假如要想深入分析手机微信开发者专用工具下的Perfor ** nce和Memory的所有作用,参照Chrome Perfor ** nce和 Chrome Memory。

截屏源自手机微信开发者专用工具和 Chrome Perfor ** nce。

3.1.1 手机微信开发者专用工具 之 Perfor ** nce

为了更好地更便捷清楚地剖析内存问题,提议开发者在模块端导出来h5小游戏新项目时,选定“开发者模式”。

应用Perfor ** nce的视频录制流程如下图所示(启用上Perfor ** nce下的ScreenShots和Memory,见下面的图棕褐色框地区):

视频录制结束后会获得如下图所示的結果,对结果依照下面得出的形式实现剖析。Perfor ** nce中国共产党有4个地区,具有不一样的功效,下面各自详细介绍。

地区1:概述对话框

包括FPS、CPU、NET、ScreenShots、HEAP五一部分。在其中:

NET相匹配地区2中的Network。每一个五颜六色条意味着一个資源。条越长,查找資源所耗费的时间段越长。每一个栏的浅色系意味着等待的时间(从要求資源到免费下载第一个字节数中间的時间)。深棕色一部分表明传送時间(免费下载第一个字符和最终一个字节中间的時间)。

条的颜色编码如下所示:

HTML文件是 深蓝色的。

s是 淡黄色的。

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的取样,多用以长期的纪录。(文中未作详细介绍)

除此之外,还能够选用 Perfor ** nce中的memory的方法来获得内存信息内容,其纪录的js heap与memory基本一致,可是有一点要留意的是, Heap snapshot纪录的是整洁的内存(GC后的),而Perfor ** nce中记载的内存并不一定通过了GC。

3.1.3 Heap snapshot

Heap snapshot 有 Sum ** ry、Comparison、Containment和Statistics四种主视图。

Sum ** ry表明按构造方法名字分类的对象。应用它可以依据构造方法名字分类的类别来搜索对象(以及内存应用状况)。这针对追踪DOM泄露尤其有效 。

Comparison表明2个快照中间的差别。应用它可以较为实际操作以前和以后的2个(或好几个)内存快照。根据查验释放出来的内存中的增加量和引用记数,可以确定内存泄露的出现和缘故。

Containment容许访问堆內容。它保证了一个更快的对象构造主视图,有利于剖析全局性类名(对话框)中引用的对象,以找到使他们不变的缘故。用它来剖析闭包并从基层深入分析对象。

Statistics表明了现阶段js heap各种各样类型的資源所占有的内存尺寸的统计图表。

1. Sum ** ry

如下图所示:在其中

Constructor表明应用此构造方法建立的全部对象。

Shallow Size表明对象自身占有的内存尺寸。

Retained Size表明删掉对象后可以释放出来的内存尺寸(依靠项不能再浏览)。这一尺寸实际上关键涵盖了依靠项的尺寸。

Distance应用连接点到根间距的最短路径算法。

进行每一行,将展示其全部案例。@标识符后的数据是对象的唯一ID,可以按对象较为堆快照。

(global property)– 全局性对象和其引用对象的正中间对象。

(roots)– 引用了选定对象的实体线对象。引用很有可能被电脑浏览器模块出自于本身目地所建立。电脑浏览器模块具有引用缓存文件,可是这种引用全是弱引用,因而不容易阻拦选定对象的垃圾分类回收。

(closure)– 根据函数公式闭包对一组对象的引用记数。

(array, string, number, regexp)– 具备引用二维数组,字符串数组,数据或正则的特性的对象种类的目录。

(compiled code)– 全部与编译程序编码有关的內容。

HTMLDivElement, ArrayBuffer等 – 对编码引用的特殊种类的要素或文本文档对象的引用。

2. Comparison

根据将好几个快照互相较为来搜索存有差别的对象。为了更好地证实某一应用软件实际操作并不会导致泄露(例如,通常是一对立即和反方向实际操作,例如开启一个文本文档,随后关掉它,不容易留有一切废弃物),您可以遵循下列情况:

1.在运行实际操作以前,视频录制堆快照(take heap snapshot)。

2.实行一项实际操作(以您觉得会致使泄露的某类方法与网页页面开展互动)。

3.实行不同的实际操作(开展反过来的互动并反复几回)。

4.拍照第二个堆快照,并将其主视图更改成“较为”,将其与快照1开展较为。

在“比较”主视图中,表明2个快照中间的差别。进行总内容时,表明加上和移除的对象案例:

3. Containment

实质上是应用软件对象构造的“全景图”。可以利用它查询函数公式闭包内部结构,观查构成Java对象的VM内部结构对象,及其掌握应用软件在极低的等级应用了是多少内存。

该主视图给予了多个通道点:

DOMWindow objects是编码层次的“全局性”对象。

GC root是VM垃圾分类回收应用的具体GC网站根目录。GC根目录可以由内嵌对象投射,符号表,VM进程局部变量,编译程序缓存文件,句柄修饰符,全局性句柄构成。

native object是Javavm虚拟机内部结构“消息推送”以容许自动化技术的电脑浏览器对象,例如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真机中即时地监管全部小游戏历程中的各类資源的转变,更可以直接地市场定位和发觉内存问题。

开发者可以监管不一样内存的占有状况,根据不一样内存的趋势分析来判定能否有内存泄露的状况,每个指标值含意如下所示:

名字

含意

sum ** ry.native-heap

native 内存

sum ** ry.system

系统软件内存

sum ** ry.total-swap

总 swap 内存

sum ** ry.graphics

显卡显存

sum ** ry.java-heap

java 内存

sum ** ry.total-pss

总内存

sum ** ry.private-other

其他私有内存

sum ** ry.code

静态代码,资源内存

sum ** ry.stack

栈内存

"内存"指总内存,其值与sum ** ry.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的变化。

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:虚拟内存

iOS设备下微信小游戏与微信处于同一进程,故直接观察微信进程的Memory Usage的变化即可。

iOS设备下Memory Usage各字段如下。在下列指标中,定位内存问题重点关注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设备下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。

Android设备下微信小游戏与微信处于不同进程,需要在PerfDog中选取小游戏进程。选取小游戏进程方式如下图所示:鼠标放置在区域“1”上,会弹出右侧浮动框,其中深 ** 域是当前微信内活跃的进程。如果此时微信正在运行小游戏,则该进程为微信小游戏进程。点击深色进程,即选中了小游戏进程。此时观察该进程的Memory 变化即可。

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

4. 测试阶段:上线前的最后一道防线

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

4.1 内存专项数据

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

可以看到内存概览、内存分布、内存Top列表和内存数据详情等多种统计数据。

内存概览:高中低档机型下,多种内存数据(如avg_graphic、avg_native)等的概况数据。

内存分布:总内存最大值( ** x_totoal)的机器数量分布情况,主要由任务测试过程与设备条件(如屏幕分辨率,操作系统)决定。

内存TOP列表:总内存最大值( ** x_totoal)排序TOP5机型。

内存数据详情:total,graphic,native,private-other的最大值与均值在各设备测试中的详细数据。

4.2 内存指标数据

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

在详细报告中有多个指标,内存分析可关注 内存指标曲线,如下图:

因为Android和iOS系统原因,内存指标曲线上在上述两个系统中获得的具体指标有所差异。

支持操作:

鼠标放置在曲线上某一点会浮窗显示该点的详细信息。

点击“指标曲线说明”,可显示/隐藏某一指标曲线。

按下鼠标左键,自左向右拖动,可缩放窗口以查看指定区域信息。

在曲线上鼠标点击某一点,可查看该时刻内存中的详细资源文件列表和统计图。

点击“对比”,可在内存指标曲线上选择两个时刻,对比两个时刻的内存资源文件的差异,差异文件以占用内存大小排序。

点击“取消对比“可取消对比。

扫码免费用

源码支持二开

申请免费使用

在线咨询