setInterval(); и FPS
Делаю игру,
где в в функции
function frame(){
находится все вычисления и отрисовка, затем я запускаю ее setInterval(frame, 10); Но тут возникает одна проблема, в разных браузерах, на разных устройствах скорость игры - разная. и это из за того что некоторые браузеры тормозят на подсчете и отрисовки. Вопрос: как сделать так чтобы те кадры которые не успевают прорисоваться "проглатывались". Или как правильно реализуются подобные игры? |
Например так, для 20-и кадров в секунду
setInterval(function() {
if((new Date) - last_time > 1000/20) {
last_time = new Date;
frame();
}
}, 10);
|
Спасибо, а как теперь подсчитать сколько кадров в секунду отрисовывается?
|
Как делают настоящие пасоны)))!!1
//requestAnimFrame
setAnimation = (function() {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
function(/* function */callback, /* DOMElement */element) {
return window.setTimeout(callback, 1000 / 60);
};
})();
//canselRequestAnimFrame
clearAnimation = (function() {
return window.cancelRequestAnimationFrame || window.webkitCancelRequestAnimationFrame || window.oCancelRequestAnimationFrame || window.msCancelRequestAnimationFrame ||
function(id) {
clearTimeout(id)
}
})();
Как юзать:
function ня() {
myAnimation = setAnimation(function() {
ня()
})
}
//чтоб остановить
clearAnimation(myAnimation)
как настоящие пасоны получают fps:
function ня(f) {
log(f)
setAnimation(function() {
var thisLoop = new Date;
var fps = 1000 / (thisLoop - lastLoop);
lastLoop = thisLoop;
// получили сколько кадров в секунду
ня(fps)
})
}
lastLoop = new Date;
ня()
|
Есть умельцы которые папкин вариант побьют)?
|
а, ну вот вам еще, петлевая анимация)
аналог setInterval
//start loop animation
function loopAnimation(call, fpsEnable, last) {
last = last || new Date
return setAnimation(function() {
if (fpsEnable) {
var now = new Date
var fps = 1000 / (now - last)
call(fps)
} else {
call()
}
loopAnimation(call, fpsEnable, now)
})
}
называется loopAnimation(call, fpsEnable) , принимает калбак и булеан значение означающее передавать в калбак FPS или нет, калбак вызывается каждый раз когда браузер рендерит страничку) loopAnimation возвращает айдишник анимации для того чтобы можно было остановить clearAnimation'oм Применяется так
loopAnimation(function(fps) {
log(fps)
}, true)
|
Для разделения обработки перемещений и отрисовки можно так:
run:function () {
var me = this,
loops = 0,
skipTicks = 33, // ~1000/30
nextGameTick = (new Date()).getTime();
var loop = function () {
loops = 0;
while ((new Date).getTime() > nextGameTick) {
me.update();
nextGameTick += skipTicks;
loops++;
}
me.render();
requestAnimFrame(loop);
};
loop();
}
|
| Часовой пояс GMT +3, время: 03:15. |