将游戏的物理系统放到worker中进行,游戏过程中会有点击事件生成新的物体,物体需要添加到worker的物理计算中。
所以游戏方即需要接受worker的数据也需要发送数据到worker(有点击事件,所以需要点击后即时响应生成一个新的使用物理的物体)。
官方demo不存在实时生成的效果,所以想问一下是否是我的使用方式不对。
目前直接在微信端模拟需要每帧获取数据的操作,代码如下
const update = () => {
var sendTime = Date.now()
test1++;
test2++;
if (worker) {
worker.terminate()
}
worker = wx.createWorker('workers/index.js')
worker.postMessage({
x: test1,
y: test2,
});
worker.onMessage(function (res) {
console.log('这是主线程打印的')
console.log(res)
console.log('间隔时间:', Date.now() - sendTime)
});
// console.log('当前dt时间:',sendTime)
// setTimeout(update, dt);
requestAnimationFrame(update)
}
worker端代码如下
worker.onMessage(function (res) {
console.log('这是worker内部线程打印的')
console.log(res)
let sum = add(res.x, res.y);
worker.postMessage({
sum: sum
})
});
function add(x, y) {
return x + y;
}
目前是疯狂警告,并且大概率上不会执行到worker的代码。
你这个写法是有点问题,创建worker的过程开销是比较大的,不应该每帧去创建一个worker。
改成这样就好了:
let worker = wx.createWorker('workers/index.js');
const dt = 1000 / 4;
let test1 = 10;
let test2 = 2;
let timer
worker.onMessage(function (res) {
console.log('这是主线程打印的')
console.log(res)
});
const update = () => {
var sendTime = Date.now()
test1++;
test2++;
if (test2 >= 10) return
worker.postMessage({
x: test1,
y: test2,
});
// console.log('当前dt时间:',sendTime)
// setTimeout(update, dt);
requestAnimationFrame(update)
}
// update();
requestAnimationFrame(update)
worker端代码有使用到wx这个对象?这些警告看起来是使用到wx的才会产生得,worker线程没有wx对象得
如果使用的是 setTimeout(update,1000/4),时间间隔是暂时测试随便写的。那么每次都会执行,电脑上也会每次都执行到但是一样会报错。
但是由于我要使用物理计算游戏内的坐标变化,,所以如果是一秒4次的刷新坐标,游戏不够流畅,没办法符合我的需求。
setTimeout间隔时间再小一些,就会出现requestAnimationFrame那样的情况