收藏
回答

worker使用问题

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小游戏 需求 worker 工具 开发者工具 2.19.2

将游戏的物理系统放到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的代码。

最后一次编辑于  2021-08-31
回答关注问题邀请回答
收藏

2 个回答

  • sine
    sine
    2021-09-01

    你这个写法是有点问题,创建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)


    2021-09-01
    有用 1
    回复 1
    • 景
      2021-09-01
      谢谢!!!目前是可以使用的。麻烦您了
      2021-09-01
      回复
  • Forever
    Forever
    2021-08-31

    worker端代码有使用到wx这个对象?这些警告看起来是使用到wx的才会产生得,worker线程没有wx对象得

    2021-08-31
    有用
    回复 3
    • 景
      2021-09-01
      我只有创建worker的时候用了wx worker端目前只是最简单的 worker.xxx的调用
      2021-09-01
      回复
    • Forever
      Forever
      2021-09-01回复
      你用手机测试一下,看看有没有警告,如果没有那就是开发者工具有问题,但不影响使用
      2021-09-01
      回复
    • 景
      2021-09-01回复Forever
      如果使用的是 requestAnimationFrame 在手机上直接没有任何打印加上报错,疑似完全没执行或卡死,电脑上的提示就是之前附上的警告图片。
      如果使用的是 setTimeout(update,1000/4),时间间隔是暂时测试随便写的。那么每次都会执行,电脑上也会每次都执行到但是一样会报错。
      但是由于我要使用物理计算游戏内的坐标变化,,所以如果是一秒4次的刷新坐标,游戏不够流畅,没办法符合我的需求。
      setTimeout间隔时间再小一些,就会出现requestAnimationFrame那样的情况
      2021-09-01
      回复
登录 后发表内容