最近、ゲームループに関する次の記事を読みました:http : //www.koonsolo.com/news/dewitters-gameloop/
推奨される最後の実装は、私を深く混乱させます。私はそれがどのように機能するか理解していません、そしてそれは完全な混乱のように見えます。
私は原則を理解しています:ゲームを一定の速度で更新し、残っているものはできるだけ多くゲームをレンダリングします。
私はあなたが使用できないと考えています:
- 25ティックの入力を取得
- 975ティックのゲームをレンダリングする
あなたは2番目の最初の部分の入力を取得するだろうし、これは奇妙に感じるので、アプローチ?それとも、記事で何が起こっているのですか?
基本的に:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
それはどのように有効ですか?
彼の価値を仮定しましょう。
MAX_FRAMESKIP = 5
メインゲームループが言う前に、初期化の直後に割り当てられたnext_game_tickを想定しましょう... 500。
最後に、ゲームにSDLとOpenGLを使用しており、OpenGLはレンダリングのみに使用されているためGetTickCount()
、SDL_Initが呼び出されてからの時間が返されると仮定します。
SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization.
ソース:http : //www.libsdl.org/docs/html/sdlgetticks.html
著者もこれを想定しています:
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
while
ステートメントを展開すると、次のようになります。
while( ( 750 > 500 ) && ( 0 < 5 ) )
next_game_tick
割り当てられてから時間が経過したため、750 。loops
あなたが記事で見ることができるようにゼロです。
whileループに入ったので、ロジックを実行して入力を受け入れましょう。
やだやだやだ。
whileループの最後に、メインゲームループ内にあることを思い出します。
next_game_tick += SKIP_TICKS;
loops++;
whileコードの次の反復がどのように見えるかを更新しましょう
while( ( 1000 > 540 ) && ( 1 < 5 ) )
1000は、GetTickCount()が呼び出されるループの次の挿入に到達する前に、入力を取得して処理を行う時間が経過したためです。
540、なぜならコードでは1000/25 = 40、したがって、500 + 40 = 540
1ループが1回反復されたため
5、あなたは理由を知っています。
だから、このWhileループは明らかに依存しMAX_FRAMESKIP
ているのでTICKS_PER_SECOND = 25;
、ゲームが正しく実行されることを意図している方法ではありませんか?
これをコードに実装したときに、ユーザー入力を処理し、記事の作者が彼のサンプルコードで持っているものにゲームを描画するように関数の名前を変更しただけで、正しく追加できることは驚きではありませんでした。
fprintf( stderr, "Test\n" );
ゲームが終了するまで印刷されないwhileループの内側に配置しました。
このゲームループは、可能な限り高速にレンダリングしながら、1秒間に25回実行されることが保証されていますか?
私にとっては、何か巨大なものを見逃していない限り、それは...何もないように見えます。
そして、このwhileループの構造は、おそらく1秒間に25回実行されてから、記事の冒頭で前に述べたとおりにゲームを更新しているのではないでしょうか?
その場合、次のような単純なことができないのはなぜですか。
while( loops < 25 )
{
getInput();
performLogic();
loops++;
}
drawGame();
そして、他の方法で補間をカウントします。
私の非常に長い質問は許してください。しかし、この記事は私にとって良いことよりも害をもたらしました。今、私はひどく混乱しています-そして、これらのすべての質問のために、適切なゲームループを実装する方法がわかりません。