OffscreenCanvas

Baseline 2023

Newly available

Since March 2023, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.

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

Bei der Verwendung des <canvas>-Elements oder der Canvas API erfolgen Rendering, Animation und Benutzerinteraktion normalerweise im Hauptausführungsthread einer Webanwendung. Die Berechnung im Zusammenhang mit Canvas-Animationen und Rendering kann erhebliche Auswirkungen auf die Anwendungsleistung haben.

Das OffscreenCanvas-Interface bietet eine Leinwand, die offscreen gerendert werden kann, und entkoppelt das DOM und die Canvas-API, sodass das <canvas>-Element nicht mehr vollständig vom DOM abhängig ist. Render-Operationen können auch im Kontext eines Workers durchgeführt werden, sodass einige Aufgaben in einem separaten Thread ausgeführt werden können, um intensive Arbeit im Hauptthread zu vermeiden.

OffscreenCanvas ist ein transferierbares Objekt.

EventTarget OffscreenCanvas

Konstruktoren

OffscreenCanvas()

OffscreenCanvas-Konstruktor. Erstellt ein neues OffscreenCanvas-Objekt.

Instanz-Eigenschaften

OffscreenCanvas.height

Die Höhe der Offscreen-Leinwand.

OffscreenCanvas.width

Die Breite der Offscreen-Leinwand.

Instanz-Methoden

OffscreenCanvas.getContext()

Gibt einen Zeichenkontext für die Offscreen-Leinwand zurück oder null, wenn der Kontextbezeichner nicht unterstützt wird oder die Offscreen-Leinwand bereits auf einen anderen Kontextmodus eingestellt wurde.

OffscreenCanvas.convertToBlob()

Erstellt ein Blob-Objekt, das das im Canvas enthaltene Bild darstellt.

OffscreenCanvas.transferToImageBitmap()

Erstellt ein ImageBitmap-Objekt aus dem zuletzt gerenderten Bild des OffscreenCanvas. Siehe die Referenz für wichtige Hinweise zur Verwaltung dieses ImageBitmap.

Ereignisse

Erbt Ereignisse von seinem Elternteil, EventTarget.

Hören Sie auf diese Ereignisse mit addEventListener() oder indem Sie einen Ereignis-Listener an die oneventname-Eigenschaft dieses Interfaces zuweisen.

contextlost

Wird ausgelöst, wenn der Browser erkennt, dass ein OffscreenCanvasRenderingContext2D-Kontext verloren gegangen ist.

contextrestored

Wird ausgelöst, wenn der Browser einen OffscreenCanvasRenderingContext2D-Kontext erfolgreich wiederherstellt.

Beispiele

Synchrone Anzeige von Frames, die von einem OffscreenCanvas erzeugt wurden

Eine Möglichkeit, die OffscreenCanvas-API zu verwenden, besteht darin, einen Rendering-Kontext zu verwenden, der von einem OffscreenCanvas-Objekt abgerufen wurde, um neue Frames zu erzeugen. Sobald ein neuer Frame in diesem Kontext fertig gerendert wurde, kann die Methode transferToImageBitmap() aufgerufen werden, um das zuletzt gerenderte Bild zu speichern. Diese Methode gibt ein ImageBitmap-Objekt zurück, das in verschiedenen Web-APIs und auch in einer zweiten Leinwand ohne Erstellung einer Transferkopie verwendet werden kann.

Um das ImageBitmap anzuzeigen, können Sie einen ImageBitmapRenderingContext-Kontext verwenden, der durch Aufrufen von canvas.getContext("bitmaprenderer") auf einem (sichtbaren) Canvas-Element erstellt werden kann. Dieser Kontext bietet nur die Möglichkeit, den Inhalt der Leinwand mit dem angegebenen ImageBitmap zu ersetzen. Ein Aufruf von ImageBitmapRenderingContext.transferFromImageBitmap() mit dem zuvor gerenderten und gespeicherten ImageBitmap vom OffscreenCanvas zeigt das ImageBitmap auf der Leinwand an und überträgt dessen Eigentum an die Leinwand. Ein einziges OffscreenCanvas kann Frames in eine beliebige Anzahl anderer ImageBitmapRenderingContext-Objekte übertragen.

Gegeben diese zwei <canvas>-Elemente

html
<canvas id="one"></canvas> <canvas id="two"></canvas>

wird der folgende Code das Rendering mit OffscreenCanvas wie oben beschrieben bereitstellen.

js
const one = document.getElementById("one").getContext("bitmaprenderer");
const two = document.getElementById("two").getContext("bitmaprenderer");

const offscreen = new OffscreenCanvas(256, 256);
const gl = offscreen.getContext("webgl");

// Perform some drawing for the first canvas using the gl context
const bitmapOne = offscreen.transferToImageBitmap();
one.transferFromImageBitmap(bitmapOne);

// Perform some more drawing for the second canvas
const bitmapTwo = offscreen.transferToImageBitmap();
two.transferFromImageBitmap(bitmapTwo);

Asynchrone Anzeige von Frames, die von einem OffscreenCanvas erzeugt wurden

Eine andere Möglichkeit, die OffscreenCanvas-API zu verwenden, besteht darin, transferControlToOffscreen() auf einem <canvas>-Element aufzurufen, entweder in einem Worker oder im Hauptthread, was ein OffscreenCanvas-Objekt von einem HTMLCanvasElement-Objekt aus dem Hauptthread zurückgibt. Ein Aufruf von getContext() wird dann einen Rendering-Kontext von diesem OffscreenCanvas abrufen.

Das main.js-Skript (Hauptthread) könnte so aussehen:

js
const htmlCanvas = document.getElementById("canvas");
const offscreen = htmlCanvas.transferControlToOffscreen();

const worker = new Worker("offscreen-canvas.js");
worker.postMessage({ canvas: offscreen }, [offscreen]);

Während das offscreen-canvas.js-Skript (Worker-Thread) so aussehen kann:

js
onmessage = (evt) => {
  const canvas = evt.data.canvas;
  const gl = canvas.getContext("webgl");
  // Perform some drawing using the gl context
};

Es ist auch möglich, requestAnimationFrame() in Workern zu verwenden:

js
onmessage = (evt) => {
  const canvas = evt.data.canvas;
  const gl = canvas.getContext("webgl");

  function render(time) {
    // Perform some drawing using the gl context
    requestAnimationFrame(render);
  }
  requestAnimationFrame(render);
};

Ein vollständiges Beispiel sehen Sie im OffscreenCanvas-Beispielquellcode auf GitHub oder führen Sie das OffscreenCanvas-Beispiel live aus.

Spezifikationen

Specification
HTML Standard
# the-offscreencanvas-interface

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch