ゲームループは固定または可変の時間ステップに基づいている必要がありますか?常に優れているのですか、それとも正しい選択はゲームによって異なりますか?
可変時間ステップ
物理の更新には「最後の更新からの経過時間」引数が渡されるため、フレームレートに依存します。これは、計算を行うことを意味する場合がありposition += distancePerSecond * timeElapsed
ます。
長所:スムーズで、コーディングが簡単
短所:非決定的で、非常に小さいまたは大きなステップで予測できない
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();
update( curr_frame_tick - prev_frame_tick );
render();
}
固定タイムステップ
更新は、各更新が一定期間のものであると想定するため、「経過時間」を受け入れない場合もあります。計算はとして行うことができますposition += distancePerUpdate
。この例には、レンダリング中の補間が含まれています。
長所:予測可能、決定論的(ネットワーク同期が容易?)、より明確な計算コード
短所:v-syncを監視するために同期されない(補間しない限りグラフィックが不安定になる)、最大フレームレートが制限される(補間しない限り)、フレームワーク内で動作しにくい可変時間ステップ(PygletやFlixelなど)を想定
while( game_is_running ) {
while( GetTickCount() > next_game_tick ) {
update();
next_game_tick += SKIP_TICKS;
}
interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
render( interpolation );
}
いくつかのリソース
- ゲームのGaffer:タイムステップを修正してください!
- deWitterのゲームループの記事
- Quake 3のFPSはジャンプの物理に影響します。これは、Doom 3が60fpsにフレームロックされる理由と言われていますか?
- Flixelは可変タイムステップを必要とします(これはFlashによって決定されると思います)が、Flashpunkは両方のタイプを許可します。
- Box2Dのマニュアル§Box2Dの世界のシミュレーションでは、一定の時間ステップを使用することを推奨しています。