我正在开发使用Java脚本的在线游戏。 我使用的setInterval(movimage,10)的方法来移动游戏角色。 但我已经看到了游戏角色的移动速度不相同的是所有的计算机。 请给我建议。
Answer 1:
取而代之的setInterval的,你应该使用requestAnimationFrame( https://developer.mozilla.org/en-US/docs/DOM/window.requestAnimationFrame )。
没有一点要更新更快的东西比屏幕可以借鉴。 你的目标是为60fps的,这是每帧16毫秒左右。
http://paulirish.com/2011/requestanimationframe-for-smart-animating/在如何做到这一点一些更多的信息。
浏览器支持是非常好的( http://caniuse.com/#feat=requestanimationframe )总之,所有当前浏览器除了Android的股票浏览器。
如果你必须在IE9这个工作,下, https://gist.github.com/paulirish/1579671做模拟在这些浏览器的行为的一份体面的工作。 (不过说实话,我怀疑这将是最后一次您的后顾之忧,特别是在考虑到缺乏canvas
...)
Answer 2:
即使脚本几乎没做什么它需要更长的时间超过10微秒为每个区间:
function interval(){
var i=0
intervalID= setInterval(function(){
console.log("called",new Date().getTime());
i++;
if(i>=10){
clearInterval(intervalID);
}
},10);
}
interval()
你开始注意到一个差异,当一台计算机是慢或浏览器速度较慢。
Answer 3:
如果你是一个游戏,下面gameloop最小化,这与在不同计算机上的不同速度运行的问题:
var loopTime = 33; // 1000ms / 30fps (what we want) = 33ms per loop
var startTime, endTime, executionTime;
function gameLoop(){
startTime = new Date().getTime();
doGameMechanics();
drawGame();
endTime = new Date().getTime();
executionTime = endTime - startTime;
if(executionTime < loopTime) { // we were faster than maximum allowed
// sleep the remaining time so the game does not go too fast
setTimeout(function(){ gameLoop(); }, loopTime - executionTime);
}else{ // we were slower than maximum allowed
setTimeout(function(){ gameLoop(); }, 0);
}
}
你要记住,你的游戏逻辑doGameMechanics()
和绘图drawGame()
需要一定的时间,太。 这可能会导致在不同的计算机速度较慢,更快的游戏行为。
在这个gameloop,我们要检查他们执行的速度有多快。 测量时间之后,我们知道我们必须要等待多久(使用setTimeout
)。 如果我们“太慢”,我们所说setTimeout
0毫秒作为第二个参数。 这是必要的,以便其他线程(如用户输入)得到执行,因为JavaScript是单线程的。