【问题标题】:Memory leak in canvas with getImageData and or putImageData使用 getImageData 和/或 putImageData 在画布中发生内存泄漏
【发布时间】:2015-11-27 03:13:42
【问题描述】:

我正在创建一个实时视频编辑器,允许您使用画布添加某些视频效果。您会在我的代码中注意到,我实际上有两个画布元素。流程是:

  1. <video> 开始使用 CSS 隐形播放。
  2. 可见的<canvas> 将视频渲染到画布上。
  3. 为了添加实时效果,我需要另一个隐藏的<canvas> 来处理视频图像,然后将处理后的帧返回到可见的<canvas>。这是我使用getImageData()putImageData() 的地方

我现在在 chrome 中看到内存泄漏。我发现很多线程都在谈论这个问题,但我一直无法找到解决方案。

出于测试目的和小提琴的目的,我删除了“视频效果”代码。没有效果处理还是会内存泄漏。

FIDDLE:http://jsfiddle.net/o8z4ocLd/

使用 Chrome 任务管理器(汉堡菜单 -> 更多工具 -> 任务管理器)观看Memory

你会注意到内存在上升,然后又回落,只是比上次上升得更高。我已经看到它爬升到 1+GB 的内存使用量,最终导致标签崩溃。我尝试了setTimeoutrequestAnimationFrame 的不同变体。似乎都导致了内存泄漏。

编辑

值得一提的是,这似乎只发生在 chrome 中。 Firefox 似乎更好地处理垃圾收集。我还没有看到Firefox超过500mb。

【问题讨论】:

  • 不是结合 requestAnimationFrame 和 setTimeout,而是重构使用 rAF 的内置时间戳版本来控制经过的时间。 rAF 减少了不完整帧的堆叠。如果您仍然遇到堆叠的帧内存损失,那么您将不得不降低 FPS——至少在 Chrome 上是这样。
  • @markE 内置时间戳版本?我还没找到类似的东西,你能详细说明一下吗?
  • 这是一个带注释的示例,说明如何使用 rAF 的时间戳来计算和使用经过的时间:jsfiddle.net/m1erickson/3k2vypu3 :-)

标签: javascript html canvas memory-leaks


【解决方案1】:

所以今天早上我的 chrome 自己更新到了 45 版。 9月45号出来了。 2015 年 1 月,此问题似乎已修复!我不再收到内存泄漏。此更新还修复了我在此线程中遇到的另一个问题:

Canvas is stretching using drawImage

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 2012-10-13
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多