我正在創建一個實時視頻編輯器,允許您使用畫布添加某些視頻效果。你會注意到在我的代碼中,我實際上有兩個畫布元素。這個過程是:使用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