GPUQueue: onSubmittedWorkDone() 方法
注意:此功能在 Web Workers 中可用。
GPUQueue 接口的 onSubmittedWorkDone() 方法返回一个 Promise,当调用该方法时,通过此 GPUQueue 提交的所有 GPU 工作都已处理完毕时,该 Promise 会解析。
这包括在调用 onSubmittedWorkDone() 之前,在队列中提交的命令所使用的 GPUBuffer 上进行的任何 mapAsync() 调用的完成。
注意:在大多数情况下,您 不需要 调用 onSubmittedWorkDone()。您 不需要 调用它来映射缓冲区。mapAsync 保证在调用 mapAsync 之前提交到队列的工作会在 mapAsync 返回之前完成(请参阅 WebGPU 规范)。
onSubmittedWorkDone 的两个用例
-
等待多个缓冲区映射(较慢)
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();第二个方法之所以慢,是因为实现可能能够在所有提交的工作完成之前映射缓冲区。例如,如果所有缓冲区的使用都已完成,但还有更多(与缓冲区无关的)工作已提交,那么使用第二个方法将比使用第一个方法花费更长的等待时间。
-
节流工作
如果您正在进行繁重计算工作并一次提交过多工作,浏览器可能会终止您的工作。您可以通过仅在已提交的工作完成后才提交更多工作来节流工作。