文档管理中心
指南快游戏开发快游戏基础能力多线程Worker

多线程Worker

场景介绍

游戏默认每16ms刷新一次屏幕,若主线程在16ms内出现耗时任务,将不能及时刷新游戏画面,导致游戏画面不流畅、用户体验不佳,因此建议开发者把耗时任务放置在Worker子线程中运行,这种异步处理方式将大大提高游戏程序的运行流畅度。

工作原理

Worker子线程与主线程在执行任务方式、通信方式均采用异步方式:

  • 执行任务方式:Worker子线程独立于主线程,支持处理主线程中较耗时的任务,但不会阻塞主线程执行任务。
  • 通信方式:主线程通知子线程执行耗时任务,Worker子线程任务执行结束后,再把任务完成结果反馈给主线程。

可行性评估

快游戏的Worker子线程、主线程与Web Worker存在差异,在能力的体现上对比如下:

展开

能力

快游戏Worker子线程

快游戏主线程

Web Worker

渲染能力

JS(qg) API

网络I/O

JS 运行时

计时器

JIT

-

引擎能力

-

并发数量

不能超过1个

-

无限制

线程通信数据传输方式

结构化克隆

-

结构化克隆/可转移对象

线程通信数据传输类型

JS对象类型及基本类型

-

JS对象类型及基本类型

开发步骤

  1. 在快游戏目录下新建Worker脚本文件。示例如下:
    收起
    自动换行
    深色代码主题
    复制
    1. workers/index.js
    添加文件后的目录结构示例如下:
    收起
    自动换行
    深色代码主题
    复制
    1. ├── game.js
    2. ├── manifest.json
    3. └── workers // 存放Worker脚本的目录,支持放置JS文件,例如Worker脚本及其require脚本;不支持放置图片、视频等静态文件。
    4. └── index.js
  2. 在manifest.json文件中配置Worker脚本的路径。
    收起
    自动换行
    深色代码主题
    复制
    1. {
    2. "workers": {
    3. "path": "workers", // 必选,指定Worker脚本的相对路径
    4. }
    5. }
  3. (可选)目前仅支持同时存在1个Worker子线程。若存在已创建且未销毁的Worker子线程,您需先在主线程中调用Worker.terminate结束之前的Worker子线程。
    收起
    自动换行
    深色代码主题
    复制
    1. worker.terminate()
  4. 调用qg.createWorker,在主线程中创建新的Worker子线程。
    收起
    自动换行
    深色代码主题
    复制
    1. const worker = qg.createWorker('workers/index.js')
  5. 在主线程或Worker子线程中发送消息。
    说明

    Worker子线程不支持qg开头的快游戏API接口。

    收起
    自动换行
    深色代码主题
    复制
    1. // 主线程向Worker线程发送消息
    2. // worker是主线程调用qg.createWorker接口返回的对象
    3. worker.postMessage({
    4. msg: 'hello from main'
    5. })
    6. // Worker线程向主线程发送消息
    7. // Worker子线程中,worker是全局变量
    8. worker.postMessage({
    9. msg: 'hello from worker'
    10. })
  6. 在主线程或Worker子线程中接收消息。
    收起
    自动换行
    深色代码主题
    复制
    1. // 主线程接收Worker线程发送的消息
    2. // worker是主线程调用qg.createWorker接口返回的对象
    3. worker.onMessage((message) => {
    4. console.log(`received message from worker: ${message}`)
    5. })
    6. // Worker线程接收主线程发送的消息
    7. // Worker子线程中,worker是全局变量
    8. worker.onMessage((message) => {
    9. console.log(`received message from main: ${message}`)
    10. })
在 指南 中进行搜索
请输入您想要搜索的关键词