我正在寻找使用CanvasRenderingContext#getImageData的GC友好方法。一种想法是一次创建一个ImageData,然后以某种方式重用它,以便getImageData不会分配新的ImageData。由于我需要每秒大约60次访问原始画布数据,因此我真的负担不起每次使用getImageData时都分配一个新的ImageData的情况。这可能吗?
答案 0 :(得分:1)
如果您需要使用除缓冲区数据处理+ putImageData之外的其他任何图形绘制,则不需要。
ctx.getImageData()
返回的ImageData对象是基础画布缓冲区的副本,它没有以任何方式链接到该内部缓冲区,并且没有任何更新的可能。画布上将对返回的ImageData进行任何更改。
请注意,有active discussions关于从画布API到例如WebAssembly进行零复制。一种想法是扩展getImageData()
,以便它“ 采用可以写入字节的视图”。但这只是在讨论阶段,我们可能需要等待一段时间才能看到解决这个越来越普遍的问题的可行解决方案。
如果您在更改ImageData中的数据后仅按ctx.putImageData()
进行绘制,那么您当然可以保留相同的ImageData而从不请求任何新数据,因为ImageData始终是最新的
另外,一个经常滥用ImageData的情况是,当我们要将其发送到WebWorkers进行处理时,请不要忘记使用worker.postMessage()
的第二个参数来传输它,否则您将在每个位置重复此数据消息。