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(編集)