课程目标:
为开发者分析APP小游戏适配的可行性,同时介绍Unity WebGL适配指南与最佳实践,帮助开发者高效适配小游戏环境。
课程大纲:
一、App小游戏适配的可行性分析
二、Unity WebGL适配指南&最佳实践
三、未来展望
“Unity小游戏适配最佳实践”中,讲师Ocean搭配案例为开发者分析APP小游戏适配的可行性,同时介绍Unity WebGL适配指南与最佳实践,帮助开发者高效适配小游戏环境。
APP小游戏适配的可行性分析
优质的APP很难转换成微信小游戏,主要原因在于编程语言、游戏引擎选型、系统底层能力等因素导致的技术架构差别。在微信小游戏环境下,开发者需要使用TS/JS进行业务逻辑的开发,引擎则会使用更轻量的H5游戏引擎。此外,在底层的能力使用上,开发者也需要使用微信小游戏所提供的JS API。
如果要将一款APP手游移植到微信小游戏做多端开发,需要更换游戏引擎和编程语言,最终游戏品质也不一定能完全还原。
WebAssembly是近几年发展较快的前端技术,简单来说它是高效的栈式虚拟机。WebAssembly不仅可以将强烈型的编程语言编译成中间语言,并且MVP特性也已被主流的浏览器支持。这使得开发者可以借助WebAssembly技术将原生应用移植到Web上
而在游戏业务上,则需要结合生产端和发布端两方面来考虑如何将原生游戏移植到Web环境中。在游戏应用场景,可以看到在生产端和发布端已支持原生游戏移植到Web环境中。
在生产端Unity、Unreal可以直接发布成以WebAssembly为基础的H5游戏包,在发布端许多H5游戏平台都支持这种方式导出的游戏包。
除了Web环境,是否也可以将APP手游以这种方案移植到微信小游戏环境呢?基于此,我们提供了新的能力WebAssembly。除了WebAssembly标准接口外,还对微信小游戏环境进行了优化,包括性能提升和扩展能力支持。
那么如何使用WebAssembly帮助小游戏开发呢?开发者可以根据自身团队情况来使用这项能力。
• Unity等原生引擎制作的项目
使用Unity等原生引擎来制作游戏项目的开发者,可以导出H5并进行小游戏适配。
• 团队维护的自研引擎
使用强类型编程语言的自研引擎,可使用emscripten工具链编译成WebAssembly,再适配到小游戏环境。
• 使用TS/JS开发的H5小游戏
使用JS/TS开发的小游戏,可使用WebAssembly重写部分重度逻辑,提升整体游戏性能。
下图有三个实际的小游戏适配案例:Unity Tiny、bgfx渲染框架、GamePlay游戏引擎。
可以发现,这三个例子都有一个共同特点,它们都使用了强类型的编程语言,通过编译成WebAssembly,最后在微信小游戏环境里进行了适配。
Unity WebGL适配指南&最佳实践
开发者对于Unity WebGL应该不陌生,这是一个Build Target,能将Unity的Runtime、业务逻辑代码,以及第三方插件都编译成WebAssembly并运行在浏览器环境。为了使Unity WebGL导出包能在微信小游戏环境得到支持,我们一共做了三个事情:
• 开发阶段:提供了平台能力的C# SDK,帮助开发者快速对接平台能力;
• 导出阶段:提供了转换工具,帮助开发者做Unity WebGL的胶水层适配并导出微信小游代码包;
• 运行期:提供了WebAssembly的执行环境及微信底层能力。
目前Unity WebGL适配的小游戏已经可以很好地运行在Android、iOS和PC微信上,Android和PC微信运行性能还不错,iOS还在优化阶段。
目前已经有多款游戏使用UnityWebGL转换方案,开发者可以扫码进行体验适配后的小游戏效果。
APP游戏如何接入适配?
我们将整个接入适配的过程分为4个部分:可行性评估-游戏转换-接入平台能力-性能调优。
•可行性评估
使用Unity WebGL适配方案的小游戏不需要更换游戏引擎,也不需要重写核心逻辑,还可以使用第三方插件(无源码的C原生插件除外)。但需要注意的是并不是所有游戏都适合适配转换,比如目前还不支持WebGL2.0, 并且在算力上WebAssembly 与Native还存在差距且不支持多线程和SIMD。
• 游戏转换
在满足可行性评估后,就可以使用转换工具进行游戏转换了。
从上图可以看出,游戏运行在微信小游戏环境和Unity Editor的还原度是非常高的,中间的转换工具是以Unity插件方式提供,开发者只需要填写基本的属性就可以使用转换插件一键导出。
• 接入平台能力
在进行转换过程后,如果游戏还原度满足需求,就可以接入微信小游戏的开放能力了,如分享、支付、广告等。这里我们提供了C# SDK,它涵盖了目前微信小游戏所提供的大部分开放能力,开发者使用C# SDK能够很快适应平台能力的对接。
• 性能调优
这是整个转换流程中最重要也是最耗费人力、时间的一个环节。在调优之前,需要先了解Unity手游APP和WebGL在性能和体验上的差异。
- 用户习惯:小游戏玩家习惯于即点即用,而手游玩家是可以接受一定的下载时间,这会为适配方案的启动速度带来挑战。
- 运行机制:WebAssembly是基于虚拟机,运算性能不如原生机器码
- 硬件算力:WebAssembly目前版本还不支持多线程和SIMD,这会进一步造成算力上的差距。
- 渲染能力:目前只支持Unity WebGL 1.0。虽然大部分游戏的还原品质还不错,但适配方案尚不支持部分高级的渲染特性,如全局实时光照等。
在这样的限制条件之下,小游戏需要达到什么样的性能呢?
我们建议开发者参考以下的性能建议:
- 高端机:首次进入游戏场景在10-15s以内,运行帧率>50fps
- 中低端机:首次进入游戏场景在20s以内,运行帧率>30fps
启动及运行性能的最佳实践
01 启动
Unity WebGL在小游戏环境中的启动过程分为三个步骤:
1、下载和编译代码包,下载首资源包;
2、初始化引擎,加载首场景;
3、加载业务场景。
每个环节都有优化空间,我们也为开发者提供了能力工具来协助优化。例如WebAssembly代码分包的能力、压缩纹理工具等。
如果Unity WebGL在小游戏启动速度非常关键的话,而它的代码包体以及资源包体的大小则是重中之重了。
● 代码包体
WebAssembly的运行机制,需要将WebAssembly代码包下载并编译,因此其大小会直接影响启动速度的整体消耗。一方面,微信底层提供了Brotli压缩/解压以减少下载带宽;另一方面,我们提供了WebAssembly代码分包工具让开发者将游戏前置阶段的代码集合剥离出来,在启动阶段只需下载一部分代码即可。除此外,开发者可通过裁剪第三方插件、精简代码、调整StripEngine级别来减小代码包体。
● 资源包体
大部分游戏资源由纹理、音效和模型带来,Unity builtin压缩后小于1MB,因此开发者需要优化业务带来的资源量。关键点是做到资源的按需加载,比如使用AssetsBundle/Addressable来做延迟加载或将底层资源剥离。此外,还可以适当降低资源品质来取得平衡。
02 运行性能
Native和WebAssembly是有算力差距的,从下图可以看出差距是3倍,而WebAssembly相对于JS又有50%的提升,因此WebAssembly运算能力介于Native和JS之间。
在运算能力差距的客观条件下,可以通过工具和手段来调优,使得转换适配的游戏还拥有足够的流畅度。
工具上可以使用微信小游戏提供的Android CPU Profiler,在真机上获取热点函数并发现计算瓶颈;也可以使用Unity所自带的Profiler分析业务相关的CPU与内存性能瓶颈。
同时,开发者需要根据业务降低Drawcall、骨骼动画、物理等方面的计算使得游戏保持流畅。
最后,如果需要知道适配后的游戏在不同机型下的性能表现,可使用微信小游戏云测试,该能力使用云真机设备来帮助开发者验证机型适配问题。
除了目前提供的能力,未来小游戏团队将会在两个方面持续为开发者带来便利:一是Unity适配流程优化与性能提升;二是支持更多的WebAssembly应用场景。