2015-09-01 59 views
3

我正在創建一個實時視頻編輯器,允許您使用畫布添加某些視頻效果。你會注意到在我的代碼中,我實際上有兩個畫布元素。這個過程是:使用getImageData和putImageData在畫布中內存泄漏

  1. <video>開始玩無形地使用CSS。
  2. 可見<canvas>呈現視頻到畫布上。
  3. 爲了添加實時效果,我需要另一個隱藏的<canvas>,它將處理視頻圖像,然後將處理後的幀返回到可見的<canvas>。這是我使用的地方getImageData()putImageData()

現在我看到chrome中的內存泄漏。我發現許多線索都在談論這個問題,但我一直無法找到解決方案。

我刪除了用於測試目的和小提琴的「視頻效果」代碼。它仍然沒有效果處理的內存泄漏。

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

觀看Memory使用鉻合金任務管理器(漢堡菜單 - >更多工具 - >任務管理器)

你會發現內存爬升,然後回落下來,只漲幅高於上一次。我已經看到它爬到1 + GB的內存使用最終崩潰的標籤。我嘗試了setTimeout和​​的不同變化。所有這些都會導致內存泄漏。

編輯

一件事值得一提的是,這似乎只在Chrome瀏覽器發生。 Firefox似乎更好地處理垃圾收集。我還沒有看到Firefox超過500MB。

+0

而是結合requestAnimationFrame加的setTimeout的,重構使用內置RAF的時間戳的版本控制經過的時間。 RAF減少了不可完成的幀的堆疊。如果你仍然得到堆棧幀內存丟失,那麼你將不得不減少FPS - 至少在Chrome上。 – markE

+0

@ markE內置時間戳版本?我一直無法找到這樣的東西,你能否詳細說明一下? – Ronnie

+0

下面是如何使用rAF的時間戳計算和使用已用時間的註釋示例:https://jsfiddle.net/m1erickson/3k2vypu3/ :-) – markE

回答

0

所以我的鉻自我更新到版本45今天早上。 45歲出生於9月。 2015年1月,這個問題似乎已經修復!我不再收到內存泄漏。此更新還固定我在這個線程有另外一個問題:

Canvas is stretching using drawImage