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

瀏覽器相容性

另見