オーバーレイ/ウィンドウの FPS を取得

オーバーレイ/ウィンドウの FPS を取得

StackExchange ではこれが適切かどうかわかりませんが、Steam (ゲーム オーバーレイ) や FRAPS などのプログラムはどのようにしてウィンドウにデータをオーバーレイするのでしょうか。オーバーレイ/FRAPS は OpenGL/DirectX で動作するウィンドウでのみ機能することに気づきました。それともオーバーレイは Windows API の機能にすぎないのでしょうか。また、FRAPS はどのようにしてウィンドウの fps を取得するのでしょうか。

答え1

FRAPSや類似のプログラムは、レンダリングされたフレームを表示するために使用するAPI呼び出しをフックすることで動作します(たとえば、IDirect3DDevice9::現在メソッドまたはOpenGLスワップバッファ()

基本的に、ゲームが新しいフレームを表示しようとすると、プログラムの実行は FRAPS によってインストールされたフックに転送されます。そのコードは、フレームを自由に変更でき、FPS カウンターをフレームの上に描画したり、色を変更したり、ビデオ録画用にスクリーンショットを撮ったりできます。それが完了すると、FRAPS は元の API を呼び出してフレームを表示します。

異なるグラフィック API には異なるフックが必要なので、FRAPS には OpenGL と Direct3D 8/9/10 などに対して個別の実装が必要です。また、新しいテクノロジ (Direct2D など) がリリースされた場合、FRAPS はこれらを処理するために更新が必要になります。

フックをインストールおよび削除する実際のプロセスはかなり複雑です。詳細については、次の StackOverflow の質問を参照してください。

挿入された DLL から DirectX EndScene をフックする

またはここ:ケーススタディ: Fraps

FPS のカウントは簡単です。プログラムに必要なのは、フレーム間の経過時間だけです。例: フレーム時間 = 20 ミリ秒、FPS = 1000 ミリ秒 / 20 ミリ秒 = 50。

フレーム時間が大きく変化すると、FPS 値も大きく変動します。より良い方法は、最後の 10 フレームの平均を計算するか、最後の 1 秒間に描画されたフレームの数をカウントすることです。ただし、FRAPS の数値は変化が速すぎるようです。

関連情報