所以,我听说你最近可以使用JS做所有花哨的实时游戏。而且我不是初学者,所以我应该尝试一下。用一些碰撞检测写了一些微(不完整)物理引擎,都很甜。虽然有点滞后,但预计GC会中断。所以试图最小化任何分配,直到我无法看到任何应该在游戏循环中分配内存的东西。没有分配=>我没有清理。但这是我得到的:
现在,这根本不是很整洁。所以我尝试以各种方式从游戏循环中删除我的东西。还是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提供奇迹。 我在这些片段中做错了什么?
编辑:顺便说一句,删除控制台日志没有任何改变,万一有人认为这是问题。答案 0 :(得分:5)
让我们分析一下这段代码:
这是在JavaScript中创建整数与无所事事的表现:
http://jsperf.com/creating-integers
但你是对的。在访问about:blank
页面并稍微调整一下代码后,我得到了一些有趣的数据。
代码:
function draw() { 1; }
function main(tFrame) {
draw();
window.requestAnimationFrame( main );
}
main();
数据:
此图表在4.6MB到5.2MB之间波动。实际上并不是那么重要。释放半兆内存非常快。不幸的是,没有办法避免这种情况。我尝试了以下方法:
var j = 1;
function draw() { j; }
虽然收集的垃圾较少; GC还在运行。在这个例子和前面的例子中,我们的代码始终以60fps运行:
故事的道德:日志记录很昂贵。它总是昂贵的;是不是javascript。