
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 の数値は変化が速すぎるようです。