0

垂直リトレース割り込みにアクセスせずに、ゲームで平均 60 (または 30) FPSを達成するにはどうすればよいですか? (一部のドライバーは vblank 割り込みを提供しません。)

とにかくモニターが表示できるよりも速くフレームをブリッティングするためにCPU時間を無駄にしたくありませんが、同時に平均フレームレートをモニターの表示レートよりもはるかに低くしたくありません。タイムリーなフィードバックの。

私は OpenGL を使用していますが、原理は GDI でもほぼ同じである必要があります。私は主にテアリングを回避することは気にしませんが、リアルタイム制御の錯覚を維持すること、つまり、入力と出力のラグの組み合わせを低く抑えます。

これには何らかの標準パターンがあるはずです。(定期的なタイマー? スリープ?) 私は Windows (pre-Metro) を使用していますが、より一般的なアイデアも大歓迎です。

4

1 に答える 1

2

追加したコメントにより、ティアリングが懸念されていることがより明確になりました。明らかに、コール時にアクティブ化するダブルバッファリングを使用する必要がありますChoosePixelFormat()が、ティアリングが発生しないようにタイミングを正しく設定する必要があります。

  • への呼び出しの直後に再描画しますSwapBuffers()。これにより、1/60秒になります。さらに必要な場合は、一時的に30fpsな​​どにドロップダウンする必要があります。

  • 次のSwapBuffersをすぐに呼び出すことができますが、そうすると100%cpuが消費されます。これは、ポイント1の時点で、その直後にバックバッファーを再描画する必要があるためです。それを回避するには、十分な時間が残っている場合はスリープを試みるQueryPerformanceCounter/Frequency必要があります。たとえば、次の1/60秒までの残り時間を決定するために使用します。たとえば8ミリ秒を超える場合はSleep(1)、それ以外の場合はビジーです。フレームレートが変化しないように待機します。過度に。

于 2012-10-21T20:49:51.600 に答える