微信小程序,微信小游戏调用WebAssembly

6 阅读3分钟

微信小程序和小游戏本质上是浏览器,小程序和小游戏的区别是游戏里面只有主进程,所以两者调用wasm会有同步异步之分。

微信官方文档资料太少,没有具体如何调用,但是浏览器内核都是一样的,微信只不过把WebAssembly封装成了WXWebAssembly,支持了压缩,思路都是一样的。

开维游戏引擎,内核c++编写,v8引擎封装游戏函数,Assembly实现htm跨平台高效运行。编译wasm需要支持导出微信小游戏,期间遇到的问题,解决时网上资料很少,我们补充一下,也建议微信小游戏官方文档能补充详细的实例和文档说明。

1. wasm 编译

wasm的编译,是把c++,或rust等语言编译成汇编语言,编译优化选项慎用,特别是优化编译,因为编译后有javascript脚本语言作为胶水代码,即解析调用wasm的这部分代码,如果优化太狠,生成是js也会跟着优化,甚至函数名称都会改变。微信中的浏览器是不支持混淆js的,会导致加载失败。原因是胶水代码调用wasm没问题,他们是可以对上的,emcc编译的时候已经做了对应,但是微信中的浏览器不知道,他是按照默认的函数名称调用的,所以就会出问题。

引擎移植遇到最多的问题之一就是链接函数找不到,无论是杀毒引擎还是游戏引擎等,都会遇到符号表找不到,问题本质上是coff文件或者其他中间文件,要根据符号表链接,编译选项不同,符号表也不一样,即便编译选项一样,关键字不同,也会导致符号名称不同,例如会加@后面的数值也不同,所以理解这个原因后查问题就很容找到,首先要排除函数名称对应不上的问题,可以用ida反编译看一下就很清楚了。

2. 微信小游戏内存

微信小游戏内存分页有限制,需要做限定。另外他对浏览器做了修改,对堆栈的管理等做了限制。有时候发现正常的浏览器可以,微信小游戏不行,是因为递归或者嵌套调用过多导致崩溃,因为微信为了保证用户在一个小沙盒内,对各种调用做了限定,包括包大小的限定等。

3. 函数调用

微信小游戏的函数不完全支持时,需要自己补函数,原来类似coff文件中,链接到自己的一个函数,把函数名称回填到内存地址中。

4. 微信小游戏中wasm适用范围  

一般情况浏览器支持的功能,微信小游戏都会支持,例如对类的支持,对文件系统的支持。因为微信小游戏浏览器也不会改太多,例如对胶水代码的加载调用,除了封装WXWebAssembly外,基本没太多变化。