最近准备把我们游戏的逻辑计算部分移到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!',
})
});
微信工具中的输出:
