我似乎在javascript中使用帧率计数器获得了一些意外的结果。直到最近,计数器一直很好,我一直在以30fps的速度运行我的小js应用。
它使用setTimeout()(通过时间调整来抵消系统的“落后”)。
window.requestAnimFrame = (function()
{
return function (callback) {
time += FPS;
Heartbeat._eTime = (new Date().getTime() - Heartbeat._start);
var diff = Heartbeat._eTime - time;
Heartbeat._delta = FPS - diff;
Heartbeat._deltaS = Heartbeat._delta / 1000;
window.setTimeout(callback, FPS - diff);
};
})();
心跳仅仅是包含帧速率信息的对象。
*这是我的问题:*
_MainLoopHandler: function () {
timer = new Date().getTime();
counter = timer;
while (this._messages.length > 0 && (counter - timer) < 5)
{
// process messages from _messages array
}
counter = new Date().getTime();
// THE ABOVE IS HAPPY AT 30 FPS
while ((counter - timer) < 6) {
1 + 1;
}
// THE ABOVE WHILE IS VERY UNHAPPY :(
}
因此,上面的代码块是每33.33毫秒(30 fps)从setTimeout调用的函数。如果我在循环播放时触底,则FPS计数器将以30fps的速度愉快地坐着。但是,如果我把它留在里面,FPS计数器就会发疯。它上升到200FPS 300FPS,然后突然上升到-200FPS -10FPS 0.01FPS。它完全脱离了墙壁。 while循环每个“帧”仅可能运行10次。
还要注意,硬编码的值5和6只是检查在处理循环(负载平衡)时是否经过了5或6毫秒的检查。
这是否只是javascript无法处理大量信息或其他任何人也有类似的问题。
谢谢!
最佳答案
我真的不知道发生了什么,但是我认为您应该使用局部变量来控制您的时间,不断重新评估counter
并一次处理1条消息。另外,我不太了解最后一个循环(我也已将变量重命名):
_MainLoopHandler: function () {
var start = new Date().getTime();
var current;
do {
if (this._messages.length === 0) break;
// process 1 message
current = new Date().getTime();
} while (current - start < 5);
}
您还可以将时序问题封装在一个对象(未显示)中以简化代码:
_MainLoopHandler: function () {
var timing = new Timing();
do {
if (this._messages.length === 0) break;
// process 1 message
} while (timing.elapsed() < 5);
}