Кажется, у меня есть неожиданные результаты со счетчиком частоты кадров в javascript. До недавнего времени счетчик был в порядке, и я запускал свое маленькое js-приложение со скоростью 30 кадров в секунду.
Он использует 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);
};
})();
Heartbeat — это просто объект, который содержит информацию о частоте кадров.
*Вот моя проблема: *
_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 :(
}
Таким образом, приведенный выше блок кода — это функция, которая вызывается из setTimeout каждые 33,33 миллисекунды (30 кадров в секунду). если я возьму нижнюю часть во время цикла, счетчик FPS будет счастливо сидеть на 30 кадрах в секунду. Однако, если я оставлю его включенным, счетчик FPS сойдет с ума. он поднимается до 200 кадров в секунду, 300 кадров в секунду, а затем внезапно становится -200 кадров в секунду -10 кадров в секунду 0,01 кадра в секунду. Это полностью от стены. Цикл while будет выполняться только 10 раз за «кадр».
Также обратите внимание, что жестко закодированные значения 5 и 6 — это просто проверка того, прошло ли 5 или 6 миллисекунд при обработке циклов (для балансировки нагрузки).
Это просто javascript не может обработать объем информации или у кого-то еще была похожая проблема.
Спасибо!