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

mor*_*les 9 javascript memory garbage-collection

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

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

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

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

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

完全一样!

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

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

Par*_*ris 5

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

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

以下是在JavaScript中创建整数与无所事事的性能:

创建整数与记录它们

http://jsperf.com/creating-integers

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

码:

function draw() { 1; }

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

main();
Run Code Online (Sandbox Code Playgroud)

数据:

GC JS看到了

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

var j = 1;

function draw() { j; }
Run Code Online (Sandbox Code Playgroud)

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

60fps ......没有记录

故事的道德:伐木很昂贵.它总是昂贵的; 是不是javascript.