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问题?我会相应地编辑答案。 –