GPUQueue: onSubmittedWorkDone() Methode

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Hinweis: Diese Funktion ist in Web Workers verfügbar.

Die onSubmittedWorkDone()-Methode der GPUQueue-Schnittstelle gibt ein Promise zurück, das aufgelöst wird, sobald alle an die GPU über diese GPUQueue gesendeten Aufträge zu dem Zeitpunkt, an dem die Methode aufgerufen wird, verarbeitet wurden.

Dies schließt den Abschluss aller mapAsync()-Aufrufe ein, die mit GPUBuffer-Objekten aufgerufen werden, die in Befehlen verwendet werden, die an die Queue gesendet wurden, bevor onSubmittedWorkDone() aufgerufen wird.

Hinweis: In den meisten Fällen müssen Sie onSubmittedWorkDone() nicht aufrufen. Sie müssen es nicht für das Abbilden eines Puffers aufrufen. mapAsync garantiert, dass Aufträge, die vor dem Aufruf von mapAsync an die Queue gesendet werden, vor der Rückgabe von mapAsync ausgeführt werden (siehe WebGPU-Spezifikation).

Die zwei Anwendungsfälle für onSubmittedWorkDone

  1. Warten auf mehrere Pufferabbildungen (langsam)

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

    Der Grund, warum die zweite Methode langsam ist, ist, dass die Implementierung möglicherweise die Puffer abbilden kann, bevor alle gesendeten Aufträge abgeschlossen sind. Zum Beispiel, wenn alle Puffer nicht mehr verwendet werden, aber mehr Arbeit (nicht in Bezug auf die Puffer) bereits gesendet wurde, dann werden Sie länger mit der zweiten Methode warten, als mit der ersten.

  2. Drosselung der Arbeit

    Wenn Sie schwere Berechnungsarbeiten ausführen und zu viel Arbeit auf einmal senden, kann der Browser Ihre Arbeit beenden. Sie können die Arbeit drosseln, indem Sie erst dann mehr Arbeit senden, wenn die bereits gesendete Arbeit abgeschlossen ist.

Syntax

js
onSubmittedWorkDone()

Parameter

Keine.

Rückgabewert

Ein Promise, das mit Undefined aufgelöst wird.

Beispiele

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

Spezifikationen

Specification
WebGPU
# dom-gpuqueue-onsubmittedworkdone

Browser-Kompatibilität

Siehe auch