GPUQueue: onSubmittedWorkDone() 方法

实验性: 这是一个 实验性技术
在生产环境中使用此功能之前,请仔细检查 浏览器兼容性表

安全上下文:此功能仅在 安全上下文(HTTPS)中可用,在某些或所有 支持的浏览器 中。

onSubmittedWorkDone()GPUQueue 接口的一个方法,它返回一个 Promise,当通过此 GPUQueue 提交给 GPU 的所有工作(在调用该方法时)都被处理时,该 Promise 会被解决。

这包括在调用 onSubmittedWorkDone() 之前,完成对提交到队列的命令中使用的 GPUBuffer 上执行的任何 mapAsync() 调用。

注意:在大多数情况下,您**无需**调用 onSubmittedWorkDone()。您**无需**为映射缓冲区调用它。mapAsync 保证在调用 mapAsync 之前提交到队列的工作在 mapAsync 返回之前发生(请参阅 WebGPU 规范:第 5.2 节

onSubmittedWorkDone 的两种用例

  1. 等待多个缓冲区映射(缓慢)
    js
    // good
    await Promise.all([
      buffer1.mapAsync(),
      buffer2.mapAsync(),
      buffer3.mapAsync(),
    ]);
    data1 = buffer1.getMappedRange();
    data2 = buffer2.getMappedRange();
    data3 = buffer3.getMappedRange();
    
    js
    // works but slow
    buffer1.mapAsync();
    buffer2.mapAsync();
    buffer3.mapAsync();
    await device.queue.onSubmittedWorkDone();
    data1 = buffer1.getMappedRange();
    data2 = buffer2.getMappedRange();
    data3 = buffer3.getMappedRange();
    
    第二种方法缓慢的原因是,实现可能能够在所有提交的工作完成之前映射缓冲区。例如,如果所有缓冲区都已完成使用,但更多(与缓冲区无关的)工作已被提交,那么使用第二种方法等待的时间将比第一种方法长。
  2. 限制工作 如果您正在执行繁重的计算工作并且一次提交了太多工作,浏览器可能会终止您的工作。您可以通过仅在已提交的工作完成后再提交更多工作来限制工作。

语法

js
device.queue.onSubmittedWorkDone()

参数

无。

返回值

一个 Promise,它以 Undefined 作为结果解析。

示例

js
device.queue.submit([commandEncoder.finish()]);
device.queue.onSubmittedWorkDone().then(() => {
  console.log("All submitted commands processed.");
});

规范

规范
WebGPU
# dom-gpuqueue-onsubmittedworkdone

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅