web-dev-qa-db-ja.com

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

これがstackexchangeでより適切かどうかはわかりませんが、Steam(ゲームオーバーレイ)やFRAPSなどのプログラムはどのようにウィンドウにデータをオーバーレイしますか?オーバーレイ/フラグメントはopengl/directxによって駆動されるウィンドウでのみ機能することに気づきましたか、それともオーバーレイはWindows APIの単なる機能ですか?また、フラップはどのようにしてウィンドウのfpsを取得しますか?

3
agz

FRAPSおよび同様のプログラムは、レンダリングされたフレームを表示するために使用されるAPI呼び出しをフックすることによって機能します(たとえば、 IDirect3DDevice9 :: Present メソッドまたはOpenGL SwapBuffers()

基本的に、ゲームが新しいフレームを表示しようとすると、プログラムの実行は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の数値はあまりにも速く変化するようですが。

6
Ryck