GPUQueue: onSubmittedWorkDone() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

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

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

注意:在大多数情况下,您 不需要 调用 onSubmittedWorkDone()。您 不需要 调用它来映射缓冲区。mapAsync 保证在调用 mapAsync 之前提交到队列的工作会在 mapAsync 返回之前完成(请参阅 WebGPU 规范)。

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
onSubmittedWorkDone()

参数

无。

返回值

一个解析为 UndefinedPromise

示例

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

规范

规范
WebGPU
# dom-gpuqueue-onsubmittedworkdone

浏览器兼容性

另见