1

以下のコード構造http://www.koonsolo.com/news/dewitters-gameloop/ を使用して、設定されたfpsに基づいて処理するが、可能な限りレンダリング/描画するゲームループを設定しています。すべての処理能力/バッテリー寿命を使い果たしないように、描画fpsにキャップを実装するにはどうすればよいでしょうか。または、v-sync用に制限します。

const int TICKS_PER_SECOND = 60;
const int SKIP_TICKS = 1000000000 / TICKS_PER_SECOND;
const int MAX_FRAMESKIP = 5;

DWORD next_game_tick = GetTickCount();
int loops;
float interpolation;

bool game_is_running = true;
while( game_is_running ) {

    loops = 0;
    while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) {
        update_game();

        next_game_tick += SKIP_TICKS;
        loops++;
    }

    interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
                    / float( SKIP_TICKS );
    display_game( interpolation );
}
4

2 に答える 2

2

あなたは実際に固有運動補間をしていると思いますか?それ以外の場合は、ゲームの更新よりも速くレンダリングすることは意味がありません。すべてのオブジェクトをまったく同じ位置に再度レンダリングするだけです。

私は次のことを提案します:

  • ビジーループThread.sleep(millis)を停止するために電話をかけます。Thread.sleep(5)次の更新の準備ができているかどうかを簡単に確認するだけなので、おそらくaで問題ありません。
  • 呼び出しに条件付きテストをdisplay_game設定して、最後のdisplay_gameから少なくとも特定のミリスコンド数が経過したかどうかを確認します。たとえば、これを10ミリ秒にすると、フレームレートは100FPに制限されます。

コードには、他にも少し不明確な点がいくつかあります。

  • DWORDとは何ですか?これは本当にJavaですか?面白いC/C ++変換のように見えますか?Javaで現在の時刻を取得する通常の方法は、long time=System.nanoTime()または同様の方法です。
  • どのグラフィックフレームワークを使用していますか?Swingの場合は、GUIスレッドをブロックしたくないので、実行しているスレッドに注意する必要があります。

最後に、更新ループをレンダリングコードから切り離して、それらを異なるスレッドで実行するかどうかも検討する必要があります。レンダリング中にオブジェクトが変更されないように、特定のオブジェクトをロックまたはスナップショットを作成する必要がある場合があるため、これを正しく行うのは難しいですが、マルチコアマシン(ほとんどのオブジェクト)でのパフォーマンスとスケーラビリティに役立ちます近頃!)

于 2012-10-11T03:00:31.650 に答える
0

display_game更新して、ペイントされているFPSを目的の制限と比較できると思います。その制限に達した場合は、次のように待機時間の待機時間を追加できます。

   Thread.sleep(500); //wait for 500 milliseconds
于 2012-10-11T02:34:37.800 に答える