“我的小游戏为什么用户流失得那么快?”开发者经常会有这样的疑问。
从我们收集到的玩家反馈来看,出现的高频词汇往往聚焦在“进不去、卡顿、黑屏”等,这些现象背后往往隐藏着启动性能、运行性能、网络性能、兼容性等多方面问题可能。那么如何评测小游戏的性能问题,又如何解决和优化它们呢?
为什么容易出现性能问题
一局小游戏的生命周期大致包含了四个阶段:打开、启动、运行和退出。小游戏的性能问题就往往集中在启动和运行两个阶段。
启动阶段往往伴随着启动性能的问题,运行阶段又有CPU超载,内存占比过高等运行性能上的问题,也有网络资源加载和上传失败等这些网络性能问题,同时,在一款小游戏的广泛受众群体里又有着一系列兼容性问题。
游戏性能问题分类
我们将性能问题归类为四大类,分别是启动性能,运行性能,网络性能和兼容性问题。以下是这四类问题的外在表现:
● 启动性能:启动耗时过长,导致在小游戏启动阶段,用户大量流失。
● 运行性能:出现小游戏闪退,手机发烫,游戏掉帧卡顿等表现。
● 网络性能:网络数据传输出现问题,比如资源下载失败,数据上传失败等。
● 兼容性问题:可能出现JS错误,或者黑白屏,甚至出现功能上的异常。
小游戏性能评测标准
1 性能评判标准关键指标
综合大盘分析以及玩家体验发现,评测小游戏性能,有六项指标十分重要,分别是启动耗时、FPS、内存峰值、Crash、黑屏率、JSError。
优秀的小游戏通常需要满足数值特征,比如小游戏的运行内存应该低于600M,启动时间低于3.5s,在帧率方面,棋牌类或超休闲类30帧,另外一些FPS/APG类需要达到60才足够流畅。开发者可以根据这六项标准值来不断优化,打造属于自己的满分小游戏。
我们进一步为每一类性能问题又补充了多种关键指标,比如:
启动性能上,由总启动耗时来反映;运行性能上,补充了CPU、卡顿次数、内存异常、退出率,等等,这样一些关键指标;在网络性能上,补充了Request的失败和延迟,DownloadFile的失败和延迟,这样的关键指标;在兼容性上,补充了黑屏率、JS错误数和启动失败这样的指标。
2 影响性能的客观因素
环境:包括开发测试环境和现网环境
在开发测试的环境,我们一般会使用固定的机器进行测试,数据比较稳定,结果比较详细;在现网环境,都是真实的玩家反馈,会出现真实使用过程中的各种情况。
维度:包括机型分档,网络环境,操作系统
机型分档涵盖了高、中、低三挡设备;网络环境有WIFI,4G,3G;操作系统主要是iOS和Android。
基于这些客观因素,进一步提升了性能评测方法,针对“不同的开发环境”提供了“多种维度”的“性能评测标准”。
3 性能指标的评价等级
为了更全面地提供指导意义,帮助开发者使用评测标准来界定游戏性能的好坏,更准确地分析性能问题,进一步为每个评价指标制定了三种评价等级,分别是“达标,平台建议和优秀”。每个评价等级下有一系列指标的标准值。
4 性能评判举例
我们举个例子看一下我们的评测标准到底是怎么样的。
例如“总启动耗时”指标,它有“开发测试环境”和“现网环境”两种不同的开发环境。每种开发环境下有Android和iOS两个不同的操作系统,在每个操作系统下,又区分了高中低档机型,在每档机型下提供了“达标”、“平台建议值”和“优秀”三种评价等级的标准值。
5 性能评测标准详情
具体的性能评测标准可以描下方二维码查看详情:
性能检测工具
1 PerfDog—人工测试
传统情况下都是使用人工测试,这时候推荐使用PerfDog,这是一款非接入式来查看内存、FPS、CPU、GPU等多项指标的应用。
我们也给大家提供了标准的测试流程,建议大家使用这个标准流程来测试自己的小游戏。比如在测试运行性能的时候,通过模拟游戏的操作,用PerfGog来记录性能指标,测3次取平均值。在测启动性能的时候,使用录屏分帧的方法来获取启动的耗时,测10次取平均值。
2 小游戏云测试—自动化性能测试
在使用传统人工测试的时候,既需要不同的设备来单独测试,而且测试的流程比较繁琐,比如测一次小游戏需要5分钟,测3-10次就非常的麻烦和耗时。
“小游戏云测试服务”是微信官方提供的一站式、全方位在线测试服务,接入也非常简单,支持一键提交测试,支持多种测试方式,来保证全面覆盖游戏场景。
原真机集群也覆盖了80%的主流机型,同时提供了非常详细的测试结果报告和专业性能数据分析。测试结果,从上图可以简单看一下,包含了启动和内存专项数据的专项解读,涵盖了全面的启动性能指标、内存运行性能指标、网络性能指标和兼容性指标。开发者使用小游戏云测试服务,可以帮助开发者节省非常多的人力和物力,来更早、更简单、更全面获取性能数据,发现性能问题。
3 小游戏云测试的测试类型
小游戏云测试为开发者提供了三种测试方式,标准化测试、录制回放测试和自定义测试:
● 标准化测试,支持无门槛接入、一键提交,但因为是使用智能探寻算法来自动探索游戏场景,所以对于某些游戏的场景覆盖并不一定完善。
● 这个时候可以使用录制回放测试,它是通过模拟玩家的操作顺序来对指定游戏流程进行测试,接入门槛很低,测试覆盖率因为是有针对性的,所以是会比较高。稍后会有一个短视频来看一下录制回放测试的整个流程。
● 自定义测试,因为自定义测试需要开发者来自己编写测试的脚本,所以它的接入成本稍微高一些。但是因为定制化程度最高,所以覆盖率是很高的。
如何优化小游戏性能
1 优化性能的两款工具
微信开发者工具
微信开发者工具,它是我们开发小游戏最常用的一款IDE工具,可以帮助我们挖掘性能问题背后深层次的原因。
真机性能监控面板
此外,大家可以在微信Android上面使用我们所提供的真机性能监控面板,它的使用也非常方便,只需要在预览小游戏的时候点击胶囊按钮打开就可以,它支持了三个功能,可以在真机中获得JS堆内存数据,同时可以打开内存、CGU、启动耗时等一系列的数据。
性能优化具体方案
1 启动时长与打开率优化
一款小游戏的启动过程可以认为包含了三个阶段:下载代码包,游戏代码注入和首屏渲染;在下载代码包的阶段可以通过精简代码包的方式来减少下载耗时。比如可以通过代码压缩混淆,图集合并,减少音频资源多种方式。另外,微信官方也提供了分包加载和引擎插件的能力,来帮助减少下载耗时。
在首屏渲染阶段,它的优化原则是尽快让开发者看到游戏场景。典型的方式是降低首屏所需要的资源,另外我们也可以不依赖引擎来绘制,这样就减少了引擎代码的注入耗时。
2 内存优化
优化内存主要是为了避免小游戏闪退。在前期和开发者交流时,发现内存问题是开发者普遍遇到的问题。不同档型的设备的内存大小不同,稍微重度的游戏很容易在低档机下闪退。
这里给大家推荐了一些常用的优化内存的策略,大家可以根据自己的小游戏的需求有针对性地选择一些策略来优化。
3 CPU优化
针对FPS较低,或者游戏卡顿的优化往往对CPU进行优化。
可以使用异步计算的方式,使用worker多线程。将计算放到worker线程中,渲染放在主线程,可以做到一边计算一遍渲染,从而大大降低同步时渲染和计算的等待时间、减少drawcall的方式。
各个引擎均提供了一些减少drawcall的策略:
合理的算法,比如根据游戏内容设置动态帧率,在moba小游戏中玩家操作少的主界面设置成30帧,而战斗场景中设置成60帧,可以有效减少主界面的cpu占用。
减少GC优化CPU,频繁的GC势必会占用大部分CPU资源,从而导致游戏卡顿,所以可以使用对象池减少GC。
4 GPU优化
GPU的优化主要是想要提升渲染能力。
优化的方式主要体现在渲染资源上的调整,比如降低几何体的复杂度,降低像素复杂度,对资源进行压缩和合并等等。
除了以上说到的优化方案外,在微信公开课《商业化实战100天-小游戏开发者学院》直播课中,讲师还进行了在线答疑,以下是部分问题节选:
Q&A
● 怎么减少GC导致的卡顿?GC会导致卡顿,不GC内存高,很难平衡怎么办?
GC触发的时刻一般是两种:堆的内存不足时,会自动触发GC;手动的调用GC(wx.tranggerGC)。针对堆内存不足的情况,可以使用对象池减少频繁的创建和删除对象;在小游戏开发时也要避免频繁地手动触发GC。针对频繁GC会导致卡顿,不GC会内存过高的情况,建议合理地设置GC的时机,比如在一些场景切换的时候触发GC,最大限度减少GC卡顿带来的体验上的影响。对于非重度小游戏,如果内存占用高,可能还是是内存方面出现了问题,建议也针对内存做出优化。
● Android首屏打开留存率怎么提升?
小游戏Android的打开率和用户进入的场景有很大的关系,比如某次诱导行为导致玩家进入小游戏,就会导致它非常低的打开率。主包大小是对启动速度影响最大的,所以要精简主包。其次,启动过程还包括框架的初始化、代码的注入等步骤,也和机型、代码本身复杂度有一定的关系,不过这里开发者能做的事情比较少。开发者可以前往微信开发文档里面来查看有性能专区的文档,对启动阶段的优化方式有非常详细的说明。
● 我们安卓首包降到1m了,但代码包加载留存不到50%,可能是什么原因?
小游戏的首屏留存率受多种因素影响,启动耗时对留存率影响非常大,但用户进入时的场景有非常大的关系,比如某些诱导行为引入的用户或者较差的导量质量会导致非常低的打开率。
● 首包之前改成只有200多k,但为什么首屏渲染还是很长?
可能和渲染代码有关,建议看看定位一下渲染的问题;也可以在微信小游戏开发者社区中提出问题,或者添加minigamedevop07小游戏助手帮助分析原因。
● Cocos空项目跑起来首屏渲染都很长?
小游戏启动主要分为代码包加载和首屏渲染两个阶段,请注意游戏启动阶段是否网络或其他较为耗时的初始化逻辑。可以通过云测试进行不同真机设备进行测试,如果问题依然存在可联系minigamedevop07小助手协助分析。
● 使用分包加载,下载分包太慢了怎么办?
可以提供下载分包的策略,比如在游戏场景里面通过动画来提供下载分包的过程。
● 引擎插件在哪?
欢迎关注小游戏开发文档。