Overlay/FPS des Fensters abrufen

Overlay/FPS des Fensters abrufen

Ich bin nicht sicher, ob das bei Stackexchange besser ist, aber wie legen Programme wie Steam (das Spiel-Overlay) und FRAPS Daten über ein Fenster? Mir ist aufgefallen, dass das Overlay/Fraps nur unter Fenstern funktionieren, die von OpenGL/DirectX gesteuert werden, oder ist das Overlay nur eine Funktion der Windows-API? Und wie ermittelt Fraps die FPS des Fensters?

Antwort1

FRAPS und ähnliche Programme funktionieren, indem sie die API-Aufrufe einbinden, die zum Anzeigen des gerenderten Frames verwendet werden (zum BeispielIDirect3DDevice9::PresentMethode oder OpenGLSwapBuffers())

Wenn ein Spiel ein neues Bild anzeigen soll, wird die Programmausführung an den von FRAPS installierten Hook übertragen. Dieser Code kann das Bild beliebig verändern, den FPS-Zähler darüber zeichnen, die Farben ändern oder einen Screenshot für die Videoaufzeichnung machen. Wenn das abgeschlossen ist, ruft FRAPS die ursprüngliche API auf, um das Bild anzuzeigen.

Verschiedene Grafik-APIs benötigen unterschiedliche Hooks, daher muss FRAPS separate Implementierungen für OpenGL und Direct3D 8/9/10 usw. haben. Das bedeutet auch, dass FRAPS bei der Veröffentlichung neuer Technologien (wie Direct2D) Updates benötigt, um diese verarbeiten zu können.

Der eigentliche Vorgang zum Installieren und Entfernen von Hooks ist ziemlich kompliziert. Weitere Informationen finden Sie in dieser StackOverflow-Frage:

Einbinden von DirectX EndScene aus einer eingefügten DLL

oder hier:Fallstudie: Fraps

Das Zählen von FPS ist einfach; Programme benötigen lediglich die zwischen den Frames verstrichene Zeit. Beispiel: Frame-Zeit = 20 ms; FPS = 1000 ms / 20 ms = 50;

Wenn die Frame-Zeiten stark variieren, schwankt der FPS-Wert stark. Eine bessere Methode wäre, einen Durchschnitt der letzten 10 Frames zu berechnen oder die Anzahl der in der letzten Sekunde gezeichneten Frames zu zählen. Allerdings scheinen sich die Zahlen in FRAPS zu schnell zu ändern.

verwandte Informationen