GPUDevice: lost 属性

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

注意:此功能在 Web Workers 中可用。

GPUDevice 接口中只读的 lost 属性包含一个 Promise,该 Promise 在设备生命周期内一直处于 pending 状态,并在设备丢失时使用 GPUDeviceLostInfo 对象进行 resolve。

GPUAdapter.requestDevice() 永远不会返回 null,并且仅在请求无效时(即超过 GPUAdapter 的能力范围)才会 reject。但是,如果由于某种原因无法满足有效的设备请求,它可能会解析为一个已丢失的设备。此外,设备在创建后随时可能由于各种原因(例如浏览器资源管理或驱动程序更新)而丢失,因此最好始终优雅地处理丢失的设备。

许多设备丢失的原因是暂时的,因此一旦之前的设备丢失,您应该尝试获取一个新设备,除非丢失是由应用程序有意销毁设备引起的(即使用 GPUDevice.destroy())。请注意,使用先前设备创建的任何 WebGPU 资源(缓冲区、纹理等)都需要使用新设备重新创建。

注意: 还要记住,GPUAdapter 可能会变得不可用,例如,如果物理 GPU 从系统中拔出或为节省电量而禁用。从那时起,适配器将无法再返回有效的设备,并且将始终返回已丢失的设备。

当设备丢失时,一个解析为 GPUDeviceLostInfo 对象的 Promise。

示例

js
async function init() {
  if (!navigator.gpu) {
    throw Error("WebGPU not supported.");
  }

  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) {
    throw Error("Couldn't request WebGPU adapter.");
  }

  // Create a GPUDevice
  let device = await adapter.requestDevice(descriptor);

  // Use lost to handle lost devices
  device.lost.then((info) => {
    console.error(`WebGPU device was lost: ${info.message}`);
    device = null;

    if (info.reason !== "destroyed") {
      init();
    }
  });

  // …
}

规范

规范
WebGPU
# dom-gpudevice-lost

浏览器兼容性

另见