一、概述
导语
微信小游戏性能是开发者们非常关注的一个话题,本文希望从小游戏性能数据、框架原理、优化方案与工具等方面做指引,为开发者介绍性能优化相关的内容。文章中引用的数据、参考材料会持续更新。
1.1 性能为何至关重要?
在我们研发微信小游戏时,经常遇到一个问题:性能。
性能对我们至关重要,因为轻微的性能问题会导致用户的卡顿、游戏体验的损失,更大的性能问题将导致玩家无法进入游戏、运行时crash等严重后果。新进活跃、留存、支付、在线时长……运营数据背后的核心点是在于用户的体验,游戏的性能是最能影响用户体验的因素之一。
然而,游戏性能是一个很复杂的话题。从产生原因来看,既会受到诸如包体大小、游戏逻辑、后端服务稳定等因素影响,同时受到微信版本、小游戏框架影响,最后还会受到玩家网络环境、机型设备等开发者无法控制的因素影响。
1.2 性能关乎用户新进转化
启动性能关乎到小游戏的用户能不能真正进入到游戏, 如果游戏启动没有优化好,就需要很久才能看到游戏的画面。很有可能很多玩家在没有等到游戏加载完就已经产生了流失。
根据小游戏整体启动留存率分析,Android玩家的首屏打开留存率约为85%。这是什么意思呢,就是玩家从点击小游戏到能看到首屏的渲染界面大约有15%的玩家流失。对于首次玩某款小游戏的玩家,由于本地没有版本缓存,留存率会明显低很多。据统计,仅代码包加载阶段新玩家流失率就达到20%
玩家打开一款小游戏典型的过程如下图所示
图1. 玩家通过不同的进入场景发现并打开小游戏
图2. 启动加载,代码包首包加载、代码注入、初始逻辑等
图3. 游戏业务更多资源加载,比如定制游戏Loading动画, CDN资源加载等
图4. 小游戏玩家可交互阶段
我们发现,许多小游戏在此过程中存在耗时过长,黑屏等启动性能问题。
那么,玩家到底是在什么时候离开我们小游戏的呢?
根据“小游戏数据助手-性能数据”中的代码包加载阶段流失时间分布显示,如果能把时间缩短到4秒内,可以减少大约30%玩家的流失。
1.3 性能关乎用户持续留存
有些游戏玩法非常有趣,品质也很高,但是玩了几分钟后手机就变得滚烫。还有一些游戏画面很精美,却因为内存占用过大而出现闪退,这些性能问题是足以让玩家流失的,即使再有趣的玩法也能难留住玩家。
根据“小游戏数据助手-性能-内存”中的内存异常退出分析,我们发现小游戏由于内存问题而退出的占比约为2%,对于重度游戏而言,这个数字达到5%~8%左右。
二、小游戏性能标准
2.1 为什么需要性能评价标准?
微信小游戏性能评价标准是根据小游戏现网性能数据、玩家体验评价,结合操作系统、机型分档、网络条件等多种维度建立的,性能评价标准的初衷是希望能引导开发者优化相关性能数据,提升用户体验。
2.2 机型分档
微信小游戏的玩家所使用的机型设备也是千差万别,但机型设备又是极为影响性能数据的一个因素。因此,我们需要对众多的机型设备进行一致性分档,唯有此才能更好的定位出现性能瓶颈的设备。目前我们的机型分档涵盖了市场主流手游机型与小游戏TOP机型,约600款设备分为高中低三档。由于设备的更新迭代,机型分档的标准也会不断变化,目前机型分档是以3个月为周期进行进行分档更新。
iOS机型分布(2019-11-20)如下:
高档机型:iPhone 7/iPhone 8/iPhone X…
中档机型:iPhone SE/iPhone 6s…
低档机型: iPhone 4/iPhone 4/iPhone 6…
Android TOP50机型分布(2019-11-20)如下:
Android厂商品牌比iOS明显多得多,从上图可以看到,TOP50也无法覆盖50%的机型,性能数据所所用的机型分档涵盖近600款设备,覆盖75%的所有机型设备。
2.3 网络环境
目前微信小游戏网络主要为WIFI和4G类型,随着网络条件的改善,也将有越来越多的玩家有5G和更好的WIFI网络质量。
2.4 微信版本
微信客户端iOS与Android以各自不同的迭代速度更新版本,目前(2019-11-20)主流版本为7.0.7/7.0.8。
2.5 公共库版本
下图为公共库版本的发布与用户占比情况(2019-11-20),数据来自https://developers.weixin.qq.com/minigame/dev/guide/runtime/client-lib/version.html
公共库迭代节奏较快,每个版本都会带来已有BUG的修复以及令人兴奋的新特性。
三、启动性能
3.1 小游戏启动加载时序
小游戏启动总体可以分为代码包加载与首屏渲染两个阶段。现网玩家的启动性能数据可以在“小游戏数据助手-性能-启动性能”中查看:
3.2 小游戏启动评价标准
iOS启动评价标准:
Android启动评价标准:
3.3 小游戏启动最佳实践
引擎插件 https://developers.weixin.qq.com/community/minigame/doc/0000869ad2c410d32a79ae64b58c01
四、运行性能
4.1 小游戏运行框架介绍
微信小程序运行在三端:iOS(iPhone/iPad)、Android 和 用于调试的开发者工具。
三端的脚本执行环境以及用于渲染非原生组件的环境是各不相同的:
关于小游戏运行框架内容可以在https://developers.weixin.qq.com/minigame/dev/guide/runtime/env.html获得更多内容。
4.2 小游戏运行性能评价标准
iOS运行性能评价标准:
Android性能评价标准:
关于游戏流畅度与帧率需要说明下,不同品类游戏对帧率要求是不一样的。例如棋牌或挂机休闲类游戏而言,通过限制帧率来降低设备资源使用是一种很好的手段, 而对格斗类游戏来说保持高帧率对于游戏手感至关重要,因此目前还很难统一流畅度的标准。此外, 性能数据对于游戏流畅度还将引入低帧比、掉帧等数据指标。
4.3 运行性能最佳实践
内存瓶颈
垃圾回收: https://developers.weixin.qq.com/minigame/dev/guide/best-practice/performance.html
内存Profile: https://developers.weixin.qq.com/minigame/dev/guide/best-practice/memory.html
纹理压缩实践: https://developers.weixin.qq.com/community/minigame/doc/0002a69c534c88d388693f5a756804
规划美术资源,降低资源质量或分辨率
动态加载和卸载资源
及时释放资源,避免内存泄漏
CPU瓶颈
合理的算法和数据结构
Worker, 异步计算数据(分帧/多线程)
数据缓存减少setTimeout、setInterval调用,尽量依赖requestAnimationFrame
可以使用ArrayBuffer的时候尽量使用ArrayBuffer,减少字符串使用
GPU瓶颈
使用Batching,尽量减少DrawCall
对不同平台使用不同的格式或处理方案(平台推荐的压缩格式)
简化或优化Shader
规划图集
优化美术资源(如模型的三角形面数,合理的粒子效果规范)减少Overdraw
五、网络性能
5.1 小游戏网络介绍
微信小游戏底层提供以下几种网络请求方式:
wx.request
wx.downloadFile
wx.uploadFile
WebSocket
UDP Socket
以上接口分别对应不同的游戏使用场景,典型地,开发者可以使用wx.request访问业务后端CGI接口,使用wx.downloadFile下载CDN资源,使用wx.uploadFile保存UGC内容,使用WebSocket长连接实现实时对战玩法,使用UDP Socket 支持对延迟更敏感的游戏应用等。
关于网络的安全域名/超时配置等基础内容可以通过https://developers.weixin.qq.com/minigame/dev/guide/base-ability/network.html获得更多内容。
5.2 小游戏网络评价标准
5.3 小游戏网络性能最佳实践
网络和IO
适当拆包或者合包
限制发包频率
分帧对网络包处理
异步加载资源
六、 性能优化工具
微信小游戏开发者可以在开发、测试、发布阶段选择不同的工具进行性能优化:
微信开发者工具-真机调试
https://developers.weixin.qq.com/miniprogram/dev/devtools
真机内存Profile
https://developers.weixin.qq.com/minigame/dev/guide/best-practice/memory.html
Chrome DevTools
https://developers.google.com/web/tools/chrome-devtools
PerfDog
https://perfdog.qq.com/
Snapdragon-Profiler
https://developer.qualcomm.com/software/snapdragon-profiler
小游戏云测试
https://developers.weixin.qq.com/community/minigame/doc/000846255205f8c92d5912fca5e401
微信小游戏开发者在研发过程中有什么技术疑问或建议,欢迎与我们交流!