requestAnimationFrame垃圾回收

Vin*_*nce 25 javascript optimization garbage-collection memory-leaks requestanimationframe

我正在使用Chrome Dev Tools v27中的时间轴分析以下代码的内存使用情况.

<!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>
Run Code Online (Sandbox Code Playgroud)

注意这很简单.但最终我看到一个牙齿图案出现,表明垃圾收集器正在回收内存.

Chrome开发工具时间轴

raf是否默认创建垃圾对象?有什么方法可以避免这种情况吗?谢谢.

Man*_*idt 6

在此处输入图片说明

我发现了以下内容:如果您将 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>
Run Code Online (Sandbox Code Playgroud)

我想这是你在 Chrome 中能做的最好的事情。我注意到在 FF 中,gc 间隔或内存几乎没有变化,所以它可能与 chrome 调试内容有关(有关更多详细信息,请参阅上面链接的 chrome 错误报告)。但是,在像这样部署 RAF 时,我注意到我自己的游戏有所改进 - 真见鬼,我需要能够在没有人工 GC 的情况下对其进行调试,这在普通用户的机器上是不会发生的。

  • 我很震惊地说这有效。惊人的发现,我什至无法想象是什么让你尝试这个。:) (2认同)

Tom*_*ski 5

我认为Chrome可能存在问题......

这里已经报道了类似的bug:

https://code.google.com/p/chromium/issues/detail?id=120186