不能使用 structuredClone() 拷贝包含 GPUBuffer 的 WebGPU 资源对象,因其属不可序列化的宿主对象,调用会抛出 DataCloneError;需手动重建配置并显式复制数据。
不能使用 structuredClone() 拷贝包含 GPUBuffer 的原始 WebGPU 资源对象。
structuredClone() 仅支持可序列化的标准 JavaScript 类型(如 Object、Array、Map、Set、Date、RegExp、ArrayBuffer 及其视图等)。WebGPU 接口对象(如 GPUBuffer、GPUTexture、GPUBindGroup 等)是平台绑定的宿主对象,没有内置的结构化克隆算法支持,也不在 HTML 规范的可克隆类型列表中。
尝试对含 GPUBuffer 的对象调用 structuredClone() 会直接抛出 DataCloneError 异常:
WebGPU 中的资源(如 GPUBuffer)代表 GPU 内存句柄或驱动层对象,不是普通数据容器。它们不保存“值”,而是指向底层 GPU 分配。因此:
device.createBuffer());queue.writeBuffer() 或映射写入;若需“等效副本”,应拆解为两步:
GPUBuffer 的 size、usage、mappedAtCreation、label 等配置,调用 device.createBuffer() 创建新实例;GPUBufferUsage.COPY_SRC),用 commandEncoder.copyBufferToBuffer() 复制到新 buffer;queue.writeBuffer() 写入过),先读取(buffer.mapAsync() + getMappedRange()),再写入新 buffer;GPUBuffer 本身无效)。即使使用 transferable 机制(如 postMessage(..., [arrayBuffer])),GPUBuffer 本身不可转移。目前 WebGPU 不提供类似 OffscreenCanvas 或 ImageBitmap 的可转移资源类型。所有 GPU 资源必须在创建它的同一 GPUDevice 所属上下文中使用。
如需多线程协作,只能传递描述信息(JSON)和二进制数据(ArrayBuffer),由目标线程用本地 GPUDevice 重建资源并载入数据。