# worker框架

小游戏框架内对微信小游戏的基础 worker 实现了一套框架封装,使其可以每帧执行任务,并与主线程进行数据交互。

封装后的 worker 有如下能力

  • 与主环境生命周期协作的调度时序
  • 易于使用的共享内存
  • 使用 Job 进行逻辑抽象

# 大致调度时序

  1. worker任务时间较短

    worker时序 - 短

  2. worker任务时间较长

    worker时序 - 长

  3. 同时存在多个 worker 任务

    worker时序 - 多个任务

# 一、worker侧配置

  1. 开启 worker 文件夹

    小游戏框架下指定assets/workers目录为 worker 目录,开发者可以在 Inspector 标签中设置开启。 开启后选择 workerSystem 模版。(也可以选择普通 workers 文件夹使用简洁模式。) 设置为 worker 文件夹后,会发现文件夹内多了一些文件,请不要手动修改这些文件。 worker文件夹

  2. 添加 worker 任务

    现在可以新建第一个 worker 任务了。
    在 worker 文件夹下新建脚本文件myJob.ts
    myJob
    输入以下代码:

    import { Job } from "engine-worker-env";
    
    export default class MyJob extends Job {
        protected init() {
            // customized init
        }
    
        protected update() {
            // real work
        }
    }
    

    任务的内容先省略,后面再回来填充。

# 二 主线程侧配置

这里默认您已经大致知道小游戏框架改如何使用了(包括如何写脚本等),如果您还不会使用小游戏框架制作简易游戏,烦请先返回之前的文档进行学习。

  1. 在需要的地方启动 worker 任务

    假如我们想要 worker 执行一个最简单的任务:每帧将一个值加1
    在想要启动 worker 任务的时候,执行以下代码:

    const game = engine.game
    // 定义主线程和 worker 进行交互的数据块
    const data = {
        num: game.workerSystem.createSharedArrayBuffer(4);
    };
    const numView = new Float32Array(data.num.buffer);
    numView[0] = 0;
    
    // game.createWorkerJob的第一个参数对应 myJob.ts 的路径
    const job = game.createWorkerJob("myJob", data);
    
    // job.start()里定义了每帧 worker 任务结束之后主线程的任务回调
    job.start(() => { console.log(numView); });
    

    接下来只要去myJob.ts里完善任务内容就可以了。

  2. 完善任务内容

    修改myJob.ts

    import { Job } from "engine-worker-env";
    
    export default class MyJob extends Job {
        private numView: Float32Array;
    
        protected init() {
            // this.data就是主线程传递过来的交互数据块
            this.numView = new Float32Array(this.data.num.buffer)
        }
    
        protected update() {
            this.numView[0] = this.numView[0] + 1;
        }
    }
    

# 三、预览和构建

  1. 预览

    在 IDE 里选择场景并预览之后,就能在控制台看到打印出来不断递增的数字了。

  2. 构建
    先点击构建Npm。
    构建npm

    然后正常构建项目即可。
    构建