收藏
评论

微信小游戏性能优化指南

一、概述

导语

 微信小游戏性能是开发者们非常关注的一个话题,本文希望从小游戏性能数据、框架原理、优化方案与工具等方面做指引,为开发者介绍性能优化相关的内容。文章中引用的数据、参考材料会持续更新。

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

微信小游戏开发者在研发过程中有什么技术疑问或建议,欢迎与我们交流!

最后一次编辑于  11-29
赞 7
收藏

1 个评论