Signatur
Beschreibung
Die Eigenschaft lost eines GPUDevice liefert ein Promise, das während der gesamten Lebensdauer des Geräts schwebend (pending) bleibt. Erst wenn das logische Gerät unbrauchbar wird, erfüllt es sich mit einem GPUDeviceLostInfo-Objekt. Das Promise wird nie abgelehnt.
Ein Gerät kann aus vielen Gründen verloren gehen: Der Treiber stürzt ab oder wird aktualisiert, die GPU wird zurückgesetzt (z. B. nach einem zu langen Shader), ein externer Grafikadapter wird abgezogen, der Browser gibt Ressourcen frei, oder Sie rufen selbst device.destroy() auf. Das Objekt GPUDeviceLostInfo enthält die Eigenschaft reason ("destroyed" bei absichtlichem Zerstören, sonst "unknown") und eine lesbare message, die nur zu Diagnosezwecken dient.
Robuste WebGPU-Anwendungen sollten device.lost immer beobachten, direkt nachdem das Gerät mit adapter.requestDevice() angefordert wurde. Bei einem unerwarteten Verlust fordern Sie einen neuen Adapter und ein neues Gerät an und legen alle GPU-Ressourcen (Puffer, Texturen, Pipelines) neu an – alte Objekte lassen sich nicht wiederverwenden.
Rückgabewert
GPUDeviceLostInfo-Objekt (reason: "destroyed" | "unknown", message: string) erfüllt. Es wird nie abgelehnt. Bei jedem Zugriff kommt dasselbe Promise zurück.Beispiele
Geräteverlust protokollieren
const adapter = await navigator.gpu?.requestAdapter();
if (!adapter) throw new Error('WebGPU nicht verfügbar');
const device = await adapter.requestDevice();
device.lost.then((info) => {
console.warn(`GPU-Gerät verloren (${info.reason}): ${info.message}`);
});
Automatische Wiederherstellung nach unerwartetem Verlust
const initWebGPU = async () => {
const adapter = await navigator.gpu.requestAdapter();
if (!adapter) {
console.error('Kein GPU-Adapter gefunden');
return;
}
const device = await adapter.requestDevice();
device.lost.then(async (info) => {
console.error('Gerät verloren:', info.message);
// Absichtliches destroy() nicht neu starten
if (info.reason !== 'destroyed') {
await initWebGPU(); // Ressourcen komplett neu aufbauen
}
});
// Hier Puffer, Texturen, Pipelines anlegen …
return device;
};
await initWebGPU();
Absichtliches Zerstören erkennen
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const lostPromise = device.lost;
device.destroy();
const info = await lostPromise;
console.log(info.reason);
console.log(device.lost === lostPromise);
// Wichtig · Fallstricke
- Das Promise wird nie abgelehnt – ein
.catch()reicht zur Überwachung nicht, nutzen Sie.then()bzw.await. Einawait device.lostim Hauptablauf blockiert die Funktion, bis das Gerät verloren geht; hängen Sie den Handler daher asynchron an. - Nach dem Verlust sind alle von diesem Gerät erzeugten Objekte unbrauchbar. Befehle schlagen still fehl (keine Ausnahmen), und
mapAsync()wird abgelehnt. Legen Sie alles über ein neues Gerät neu an. - Auch
adapter.requestDevice()kann ein bereits verlorenes Gerät zurückgeben, wenn der Adapter nicht mehr gültig ist – in diesem Fall istlostsofort erfüllt. Fordern Sie zur Wiederherstellung daher immer einen neuen Adapter an. - Werten Sie
messagenicht programmatisch aus; der Text ist implementierungsabhängig. Entscheiden Sie nur anhand vonreason. - WebGPU steht nur in sicheren Kontexten (HTTPS) zur Verfügung und wird noch nicht von allen Browsern und Plattformen unterstützt – prüfen Sie vorher
navigator.gpu.