Framecounter: Unterschied zwischen den Versionen
Flash (Diskussion | Beiträge) K (→Methode 1) |
Flash (Diskussion | Beiträge) K (→Beispielcodes) |
||
Zeile 38: | Zeile 38: | ||
Der folgende Code wird im OnIdle-Event des OpenGL Formulars ausgeführt. Die Anzahl der Frames wird in der Beschriftung (Caption) des Fensters ausgegeben. | Der folgende Code wird im OnIdle-Event des OpenGL Formulars ausgeführt. Die Anzahl der Frames wird in der Beschriftung (Caption) des Fensters ausgegeben. | ||
− | + | <pascal> procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean); | |
begin | begin | ||
// | // | ||
Zeile 59: | Zeile 59: | ||
Done:= false; | Done:= false; | ||
− | end; | + | end;</pascal> |
[[Kategorie:Anleitung]] [[Kategorie:Technik_oder_Algorithmus]] | [[Kategorie:Anleitung]] [[Kategorie:Technik_oder_Algorithmus]] |
Version vom 6. Oktober 2005, 23:07 Uhr
Wenn man in seinem Programm die Frames pro Sekunde (FPS) anzeigen lassen möchte, so gibt es verschiedene Lösungswege.
Methode 1
Am Anfang der Renderschleife "misst" man die Zeit und speichert sie in einer Variable. Dafür kann man die von Windows bereitgestellten Methoden "Gettickcount" (gibt in Millisekunden an, wie lange Windows läuft) oder "QueryPerformanceCounter" verwenden. Für unsere Zwecke reichen diese beiden Funktionen vollkommen aus.
Als zweiten Schritt rendert man seine Szene, verarbeitet Tastatureingaben usw. Also alles was in der Renderschleife passiert.
Am Ende der Renderschleife stoppt man dann ein zweites Mal die Zeit und erhält nun eine Zeitdifferenz.
Die FPS erhält man nun durch folgende Berechnung:
FPS = 1000 / Zeitdifferenz;
Wobei Zeitdifferenz bei dieser Formel auch in Millisekunden angegeben sein muss.
Methode 2
Diese Methode unterscheidet sich kaum von Methode 1. Wieder wird:
- Startzeit bestimmt
- gerendert
- Endzeitbestimmt
- Zeitdifferenz berechnet
Anschließend wird die Zeitdifferenz auf eine Variable TimeCount addiert. Außerdem wird eine Zählvariable für die Frames erhöht.
Wenn die Variable Timecount größer-gleich 1000 wird (es ist mindestens 1 sec vergangen) wird die Frameanzahl berechnet und ausgegeben.
Die Methode 2 hat gegenüber Methode 1 den Vorteil, dass die Frameanzahl nicht nach jedem Frame sondern maximal nur einmal pro Sekunde berechnet wird.
Beispielcodes
Methode 2: Der folgende Code wird im OnIdle-Event des OpenGL Formulars ausgeführt. Die Anzahl der Frames wird in der Beschriftung (Caption) des Fensters ausgegeben.
procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean); begin // StartTime:= GetTickCount; Render; DrawTime:= GetTickCount - StartTime; inc(TimeCount, DrawTime); inc(FrameCount); if TimeCount >= 1000 then begin Frames:= FrameCount; TimeCount:= TimeCount - 1000; FrameCount:= 0; Caption:= InttoStr(Frames) + 'FPS'; end; Done:= false; end;