FRAPS und ähnliche Programme funktionieren, indem sie die API-Aufrufe verwenden, die zum Anzeigen des gerenderten Frames verwendet werden (z. B. IDirect3DDevice9 :: Present- Methode oder OpenGL SwapBuffers () ).
Wenn ein Spiel gerade einen neuen Frame anzeigt, wird die Programmausführung im Wesentlichen an den von FRAPS installierten Hook übertragen. Dieser Code kann den Rahmen nach Belieben modifizieren, den FPS-Zähler darüber ziehen, Farben ändern oder einen Screenshot für die Videoaufnahme erstellen. Wenn dies abgeschlossen ist, ruft FRAPS die ursprüngliche API zur Anzeige des Frames auf.
Unterschiedliche Grafik-APIs erfordern unterschiedliche Hooks. FRAPS muss daher separate Implementierungen für OpenGL und Direct3D 8/9/10 usw. haben. Das bedeutet auch, dass neue Technologien (wie Direct2D) veröffentlicht werden, für die FRAPS Aktualisierungen benötigt.
Der eigentliche Prozess zum Installieren und Entfernen von Haken ist ziemlich kompliziert. Weitere Informationen finden Sie in dieser StackOverflow-Frage:
Hooking DirectX EndScene von einer injizierten DLL
oder hier: Fallbeispiel: Fraps
FPS zu zählen ist einfach; Programme brauchen nur die Zeit zwischen den Bildern. Zum 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 die Berechnung eines Durchschnitts der letzten 10 Frames oder das Zählen der Anzahl der über die letzte Sekunde gezogenen Frames. Die Zahlen in FRAPS scheinen sich jedoch zu schnell zu ändern.