什么在吃我的记忆? (SAW,JS mem使用版)

时间:2015-03-05 20:37:21

标签: javascript memory garbage-collection

所以,我听说你最近可以使用JS做所有花哨的实时游戏。而且我不是初学者,所以我应该尝试一下。用一些碰撞检测写了一些微(不完整)物理引擎,都很甜。虽然有点滞后,但预计GC会中断。所以试图最小化任何分配,直到我无法看到任何应该在游戏循环中分配内存的东西。没有分配=>我没有清理。但这是我得到的: enter image description here

现在,这根本不是很整洁。所以我尝试以各种方式从游戏循环中删除我的东西。还是SAW。所以,我没有向您提供生成此代码的完整代码:

<html><body><script>
    function draw() { console.log(1); }
    ;(function () {
        function main(tFrame) { draw(); window.requestAnimationFrame( main ); }
        main();
    })();
</script></body></html>

惊人?那么这使用requestAnimationFrame,因为它似乎应该用于平滑性能。起初我尝试设置间隔如下:

<html><body><script>
    function draw() { console.log(1); }
    window.setInterval(draw, 0);
</script></body></html>

完全相同的事情!

这似乎完全不可接受,但我不知道如何阻止这种SAW。我看了很多关于调试内存和东西的事情,那时我虽然问题出现在我的绘图和更新功能中。但这些到片段,基本上没什么,但它们产生了记忆模式。也许这是我的浏览器?或者它是不可避免的,JS无法实时使用?我想相信网络上的某些人知道我不会做的事情,因为有很多人在为JS提供奇迹。 我在这些片段中做错了什么?

编辑:顺便说一句,删除控制台日志没有任何改变,万一有人认为这是问题。

1 个答案:

答案 0 :(得分:5)

让我们分析一下这段代码:

  • 您正在启动时创建3个功能
  • 每个绘制调用创建一个整数(每秒60次以上)
  • 每个绘制调用都会记录一次(顺便说一下,这是非常慢的)

这是在JavaScript中创建整数与无所事事的表现:

Creating Integers versus logging them

http://jsperf.com/creating-integers

但你是对的。在访问about:blank页面并稍微调整一下代码后,我得到了一些有趣的数据。

代码:

function draw() { 1; }

function main(tFrame) { 
    draw(); 
    window.requestAnimationFrame( main ); 
}

main();

数据:

GC JS Saw

此图表在4.6MB到5.2MB之间波动。实际上并不是那么重要。释放半兆内存非常快。不幸的是,没有办法避免这种情况。我尝试了以下方法:

var j = 1;

function draw() { j; }

虽然收集的垃圾较少; GC还在运行。在这个例子和前面的例子中,我们的代码始终以60fps运行:

60fps... no logging

故事的道德:日志记录很昂贵。它总是昂贵的;是不是javascript。