我正在创建一个实时视频编辑器,允许您使用画布添加某些视频效果。你会注意到在我的代码中,我实际上有两个画布元素。这个过程是:使用getImageData和putImageData在画布中内存泄漏
<video>
开始玩无形地使用CSS。- 可见
<canvas>
呈现视频到画布上。 - 为了添加实时效果,我需要另一个隐藏的
<canvas>
,它将处理视频图像,然后将处理后的帧返回到可见的<canvas>
。这是我使用的地方getImageData()
和putImageData()
现在我看到chrome中的内存泄漏。我发现许多线索都在谈论这个问题,但我一直无法找到解决方案。
我删除了用于测试目的和小提琴的“视频效果”代码。它仍然没有效果处理的内存泄漏。
FIDDLE:http://jsfiddle.net/o8z4ocLd/
观看Memory
使用铬合金任务管理器(汉堡菜单 - >更多工具 - >任务管理器)
你会发现内存爬升,然后回落下来,只涨幅高于上一次。我已经看到它爬到1 + GB的内存使用最终崩溃的标签。我尝试了setTimeout
和的不同变化。所有这些都会导致内存泄漏。
编辑
一件事值得一提的是,这似乎只在Chrome浏览器发生。 Firefox似乎更好地处理垃圾收集。我还没有看到Firefox超过500MB。
而是结合requestAnimationFrame加的setTimeout的,重构使用内置RAF的时间戳的版本控制经过的时间。 RAF减少了不可完成的帧的堆叠。如果你仍然得到堆栈帧内存丢失,那么你将不得不减少FPS - 至少在Chrome上。 – markE
@ markE内置时间戳版本?我一直无法找到这样的东西,你能否详细说明一下? – Ronnie
下面是如何使用rAF的时间戳计算和使用已用时间的注释示例:https://jsfiddle.net/m1erickson/3k2vypu3/ :-) – markE