我一直在尝试用 HTML5/JS 制作一个简单的游戏。我已经设法为状态机和游戏循环准备了一个基本骨架,但即使是做一个简单的矩形移动也会导致一些“有形”的波动。
更重要的是,在让它闲置一段时间(跳出)之后,它似乎滴答作响的速度非常快,使一个简单的按键移动矩形远远超过它应该。
我正在使用setTimeout
游戏的更新。在每个“滴答”期间,我调用当前状态的更新函数,即
State.prototype.update = function(ms) {
this.ticks += ms;
var updates = 0;
while(this.ticks >= State.DELTA_TIME && updates < State.MAX_UPDATES) {
this.updateState();
this.updateFrameTicks += State.DELTA_TIME;
this.updateFrames++;
if(this.updateFrameTicks >= 1000) {
this.ups = this.updateFrames;
this.updateFrames = 0;
this.updateFrameTicks -= 1000;
}
this.ticks -= State.DELTA_TIME;
updates++;
}
if(updates > 0) {
this.renderFrameTicks += updates*State.DELTA_TIME;
this.renderFrames++;
if(this.renderFrameTicks >= 1000) {
this.rps = this.renderFrames;
this.renderFrames = 0;
this.renderFrameTicks -= 1000;
}
this.renderState(updates*State.DELTA_TIME);
}
};
这个想法是Game.update
使用 尽可能频繁地调用setTimeout
,然后将经过的时间传递给State.update
。State.update
仅当状态累积的时间大于或等于固定更新时间步长时才会更新状态。如果状态实际更新,State.update
也会渲染/重绘当前状态,确保状态呈现与状态模拟相匹配。
现在,我知道这requestAnimationFrame
比 更好setTimeout
,但理论上当前版本应该可以工作,除非我犯了一个根本性错误。
这是我到目前为止所拥有的:http: //jsbin.com/ogicec/1(编辑)
您可以清楚地观察到它有断断续续的现象,如果您长时间观察并重新进入,它似乎比正常运行“更快”。
我无法真正确定问题所在,因此非常感谢您的帮助!
编辑:
我将状态的更新和渲染部分分开,setTimeout
用于更新和requestAnimationFrame
渲染。它解决了标签问题,整个事情感觉更加一致。但是,与此同时,性能仍然不稳定,我想在继续添加更多游戏相关代码之前确保它足够流畅。
这是更新的 JSBin:http: //jsbin.com/eyarod/1(编辑)