Javascript内存管理(requestAnimationFrame回调)
Javascript memory management (requestAnimationFrame callback)
我试图公然剽窃小行星,但遇到了严重的内存管理问题。
我使用window.requestAnimationFrame为我的游戏提供帧,方法是让一个"gamelop"函数调用requestAnimationFrame,并将其本身作为参数。然而,我一定做错了什么,因为我的游戏内存使用量很大,这导致了频繁的垃圾收集和糟糕的性能(以及与之相关的典型锯齿状内存使用模式)。我很确定这个问题的原因是这个函数和回调的循环创建了许多函数对象——可能是一些无害的语句,导致创建了一个函数而不是重用。。。可能是gameloop函数。。。
我从这篇帖子中得到了这个想法:https://www.scirra.com/blog/76/how-to-write-low-garbage-real-time-javascript
下面是一个jsfiddle,上面有我的代码:http://jsfiddle.net/LEqUr/(将窗口对准太空,使新的小行星出现)。我知道我的一些东西是驼色的,有些是用下划线做的——对不起。
这是(我认为)代码中最相关的部分:
var gameLoop = function () {
getSetStageSize(1, 1);
ctx.clearRect(0, 0, canvas.width, canvas.height);
updateGameState();
window.requestAnimFrame(gameLoop);
}
window.requestAnimFrame = (function () {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function (callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
综上所述,我真的很想得到一些关于我的代码是如何组织的反馈(它肯定需要一些工作),一些关于回调的信息,一些关于如何/何时在疯狂的嵌套回调中创建对象的信息,以及任何其他有用的建议。
谢谢!
我对动画的特定部分不太了解,但你可以稍微简化最后一部分。您不需要IIFE,因为您没有声明任何局部变量。
window.requestAnimFrame = (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function (callback) {
window.setTimeout(callback, 1000 / 60);
}
);
除此之外,您可能还需要考虑在幕后使用setInterval而不是setTimeout进行编码。当您使用setTimeout时,每帧的实际时间是从超时开始的(100/60)加上代码处理该帧所需的时间。另一方面,setInterval更了解幕后的真实时钟,并将调整帧之间的超时以补偿处理时间。
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 自引用回调
- 测试Angular Service解决错误回调中的promise
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- 将json回调数据转换为日期
- 承诺在非节点式回调上使用Bluebird
- 如何在回调函数中执行流
- 回调函数中传递参数的困难(Google Map API Markers)
- Soundcloud Javascript SDK 3.0-回调无法读取属性'connectCallback
- 如何使用jqueryAJAX从页面中回调多个变量
- jquery Onclick函数带有导致双击的回调排序函数
- Javascript点击事件回调不起作用
- 一旦加载并渲染了角度引导typeahead,就使用回调
- 成功回调永远不会被JSONP请求调用
- 如何让程序员在javascript中实现正确的回调
- Angularjs使用“;这个“;promise内的关键字回调