Javascript 使用transferControlToOffscreen后重新附加画布上下文?

Javascript 使用transferControlToOffscreen后重新附加画布上下文?,javascript,html,canvas,Javascript,Html,Canvas,我正在玩一个项目,在这个项目中,我在多个web Worker中运行了多个模拟 当我需要查看模拟的当前状态时,我在主线程的画布元素上使用transferControlToOffscreen,并将句柄传递给webworker 问题是,下次我尝试使用transferControlToOffscreen或只是将现有句柄传递给另一个web worker时,浏览器会抱怨我无法重新打开画布 An OffscreenCanvas could not be cloned because it was detach

我正在玩一个项目,在这个项目中,我在多个web Worker中运行了多个模拟

当我需要查看模拟的当前状态时,我在主线程的画布元素上使用transferControlToOffscreen,并将句柄传递给webworker

问题是,下次我尝试使用transferControlToOffscreen或只是将现有句柄传递给另一个web worker时,浏览器会抱怨我无法重新打开画布

An OffscreenCanvas could not be cloned because it was detached
在再次使用transferControlToOffscreen之前,是否需要调用一个函数来重新连接画布


编辑:似乎我也无法通过MessageChannel在工人之间传递Offscreencavas


我唯一可以取消画布句柄的选项是WorkerA,用一个新的画布(可能是克隆的)替换当前画布(在主线程中),然后向worker B发送一个新的offscreenCanvas?

因此,唯一的解决方案是克隆画布,用自己的克隆替换DOM中的画布,然后在克隆上使用transferControlToOffscreen时,我发现这是在直接使用屏幕外变量调用worker.postMessage(
worker.postMessage({canvas:offscreen},offscreen)
)时发生的,只需将传输变量转换为数组即可修复:
worker.postMessage({canvas:offscreen},[屏幕外]

我认为您可以使用
offscreencavasrenderingcontext2d#commit
将原始画布的内容替换为屏幕外画布上下文中的内容(无论是“2d”还是“webgl”)。只是好奇,您是否尝试将OffscreenCavas从工作线程发送回主线程,然后让主线程使用该线程和/或将其传递给另一个工作线程?