24

我正在使用Chrome開發工具v27中的時間軸來分析下列代碼的內存使用情況。requestAnimationFrame垃圾回收

<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv='content-type' content='text/html; charset=UTF-8' /> 
    <title>RAF</title> 
</head> 
    <body> 
    <script type='text/javascript' charset='utf-8'> 
     var frame = function() { 
     window.webkitRequestAnimationFrame(frame); 
     }; 
     window.webkitRequestAnimationFrame(frame); 
    </script> 
    </body> 
</html> 

注意這很簡單。但最終我看到出現了一個指示垃圾回收器正在回收內存的牙齒模式。

Chrome Dev Tools Timeline

皇家空軍是否默認創建垃圾對象?有什麼辦法可以避免這種情況?謝謝。

+0

相關。這一領域似乎存在更多潛在問題。我會建議也許用一粒鹽來取這整個內存監視工具的輸出?老實說,我不確定要從這些結論中得出什麼結論。 http://stackoverflow.com/questions/19395565/chrome-requestanimationframe-issues –

+0

如果其他人願意這樣做,我會提出一個賞金:>已經在想如果它可能有助於有兩個函數翻轉觸發器相互註冊。 –

回答

2

它看起來像一個保留週期。 Frame正在調用自己,因此保留一個保留計數並且不會被釋放。而且,無論您使用配置文件,時間線還是堆棧來監視正在運行的代碼,都會產生一些副作用。

無論哪種方式,我不會擔心它。如果您想要獲得應用程序或頁面性能,則需要解決更多的問題。只要JS在16ms內完成,沒有人會注意到任何事情。

最大的內存/ CPU問題是:網絡調用,解壓縮PNG/JPG,創建和銷燬DOM元素,在非工作線程上處理/解析數據,糟糕使用GPU紋理以及分配大量數據以導致GC需要很長時間來收集數據。

我能夠優化帶有1,000,000個項目的滾動列表,使其在Chrome上以120FPS運行(https://github.com/puppybits/BackboneJS-PerfView)。性能工具應該可以幫助您找到用戶可以看到的最大問題,而且您不必擔心小問題。

+0

嘿!你有任何想法如何將這個想法用於RAF動畫嗎? – thednp

4

enter image description here

我發現了以下工作: 如果您改變RAF功能分爲兩個「乒乓」之類的功能,你少了很多垃圾。你無法避免第一個最初的「大GC」,但在此之後,你只能看到約50kb的小GC,而不是700kb-1mb的GC。該代碼將是這樣的:

<script type='text/javascript' charset='utf-8'> 
    window.frameA = function() { 
    window.webkitRequestAnimationFrame(window.frameB); 
    }; 
    window.frameB = function() { 
    window.webkitRequestAnimationFrame(window.frameA); 
    }; 
    window.webkitRequestAnimationFrame(window.frameA); 
</script> 

我想這是你可以在Chrome中做的最好的。 我注意到在FF中gc的間隔或內存幾乎沒有變化,所以它可能與chrome調試相關(請參閱上面鏈接的chrome錯誤報告瞭解更多細節)。然而,當我這樣部署RAF時,我注意到了自己的遊戲改進 - 而且我需要能夠調試它,而不需要在普通用戶機器上不會發生的人工GC。

+1

我很震驚地說這是有效的。驚人的發現,我甚至無法想象是什麼讓你嘗試這個。:) – Jaruba

+0

我沒有看到這項工作 – kevzettler

+0

Kevzettler:這總是一個黑客,希望有一天會過時。你能告訴我們你測試過哪個Browserversion嗎?一般來說,你是否仍然觀察gc問題?我會相應地編輯答案。 –