微信SharedArrayBuffer使用记录

最近准备把我们游戏的逻辑计算部分移到worker线程中去,因为数据交换比较频繁,所有实验了一下SharedArrayBuffer的使用。

网上关于cocos creator开发worker线程的教程很少,而关于SharedArrayBuffer的使用更是三缄其口。特别是微信开发文档,也不说清楚怎么用,API也查不到。多年来的各种反馈,官方也从未好好回答。

可能因为并非前端出生,其实遇到是非常入门基础的问题。但为了能给很多像我一样的人解惑,还是写出来记录一下。

先说重点:
1、wx.createSharedArrayBuffer,这个微信小游戏创建SharedArrayBuffer的接口
2、SharedArrayBuffer必须在createWorker之后调用。否则SharedArrayBuffer传到worker线程中拿到的是undefined。

网上关于使用了SharedArrayBuffer的文章有很多,但真正写怎么用的就这一篇(不知道是不是我能力有限),其他更多的是遇到了问题求助的:

微信小游戏性官文说明:
(worker框架 | 微信开放文档)
但是里面的API是旧的,无法使用,而且SharedArrayBuffer的创建在createWorkerJob之前,这导致我改了API后,worker线程始终拿不到,花了半天的时间找问题。另外,createWorkerJob在cocos里好像也不能用,而是wx.createWorker(这个 SDK中到是能找到)。

主线程:

var worker = wx.createWorker('workers/MyJob.js');
const rawArray =  wx.createSharedArrayBuffer(4);
const intData = new Int32Array(rawArray.buffer);

intData[0] = 123;

worker.onMessage(function (event) {
    console.log(event.msg);
    console.log("after worker, ", intData[0])
});

worker.postMessage({ data: rawArray });

worker线程:

worker.onMessage(function (meg) {
  console.log('这是worker内部线程打印的')

  const intView = new Int32Array(meg.data.buffer);
  console.log("from main === ",intView[0]);

  intView[0] = 456;

  worker.postMessage({
    msg : 'Hello main!',  
  })
});

微信工具中的输出:
image

2赞

这种功能 用WX专用的接口 ,如果是多平台发布,该怎么办?

真不太明白, 为啥微信小游戏 worker 通讯不支持transferable objects

据我测试, iOS高性能+ 和iOS高性能 这两个是不支持SharedArrayBuffer的, 你的demo, 会输出after worker, 123