Javascript 有没有办法重用ImageData以减少GC活动?

Javascript 有没有办法重用ImageData以减少GC活动?,javascript,canvas,html5-canvas,getimagedata,Javascript,Canvas,Html5 Canvas,Getimagedata,我正在寻找一种GC友好的使用方法。一个想法是创建一个ImageData并以某种方式重用它,这样getImageData就不会分配一个新的。由于我需要每秒访问原始画布数据大约60次,因此我无法每次使用getImageData时都分配新的ImageData。这可能吗?如果需要使用缓冲区的数据操作+putImageData以外的任何其他方法进行绘制,则不可能 ctx.getImageData()返回的ImageData对象是底层画布缓冲区的副本,它没有以任何方式链接到该内部缓冲区,对画布的任何更新都不

我正在寻找一种GC友好的使用方法。一个想法是创建一个ImageData并以某种方式重用它,这样getImageData就不会分配一个新的。由于我需要每秒访问原始画布数据大约60次,因此我无法每次使用getImageData时都分配新的ImageData。这可能吗?

如果需要使用缓冲区的数据操作+putImageData以外的任何其他方法进行绘制,则不可能

ctx.getImageData()
返回的ImageData对象是底层画布缓冲区的副本,它没有以任何方式链接到该内部缓冲区,对画布的任何更新都不会对返回的ImageData进行任何更改

请注意,还有一些关于从画布API到例如WebAssembly的零拷贝的问题。一个想法是扩展
getImageData()
,以便“查看可以写入哪些字节”。但这只是讨论阶段,我们可能需要等待一段时间才能看到任何可行的解决方案来解决这个越来越普遍的问题

如果您在更改ImageData中的数据后仅通过
ctx.putImageData()
绘制,那么您当然可以保留相同的ImageData,并且从不请求任何新的,因为您的ImageData始终是最新的


另外,ImageData的一个非常常见的误用是,当我们想将它发送给WebWorkers进行处理时,不要忘记使用第二个参数
worker.postMessage()
传输它,否则您会在每条消息中重复此数据。

感谢您给出了这个漂亮的答案。为了指定一个可重用的缓冲区,我差点就提出了一个额外的参数go getImageData。很高兴看到关于这个问题的讨论正在进行。在我看来,60 FPS的网页是必须的。我知道可转移的概念,这就是我为什么要玩缓冲区的原因。只是当我们试图将缓冲区用作可转移缓冲区时,getImageData阻塞了主进程。