Framecounter: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(andere Methode mit Code)
K (Problemstellung)
 
(14 dazwischenliegende Versionen von 10 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Wenn man in seinem Programm die [[Frame]]s pro Sekunde (FPS) anzeigen lassen möchte, so bietet sich verschiedene Lösungswege an.
+
==Problemstellung==
 +
Die Bildwiederholrate in Frames per Second ist ein in Computerspielen oftmals verwendeter Wert, der eine Aussage über die Leistungsfähigkeit des Computersystems geben kann.<br>
 +
Wenn man in seinem Programm die Frames pro Sekunde ([[FPS]]) anzeigen lassen möchte, so gibt es verschiedene Lösungswege.
  
== Methode 1 ==
+
==Ansätze==
 +
===Methode 1===
  
 
Am Anfang der Renderschleife "misst" man die Zeit und speichert sie in einer Variable.
 
Am Anfang der Renderschleife "misst" man die Zeit und speichert sie in einer Variable.
Dafür kann man die von Windows bereitgestellten Methoden "Gettickcount" [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/gettickcount.asp] (gibt in Millisekunden an, wie lange Windows läuft) oder QueryPerformanceCounter [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Timers/TimerReference/TimerFunctions/QueryPerformanceCounter.asp] .
+
Dafür kann man die von Windows bereitgestellten Methoden [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/gettickcount.asp "Gettickcount"] (gibt in Millisekunden an, wie lange Windows läuft) oder [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Timers/TimerReference/TimerFunctions/QueryPerformanceCounter.asp "QueryPerformanceCounter"] und unter SDL SDL_GetTicks verwenden.
Für unsere Zwecke reichen diese beiden Funktionen vollkommen aus.
+
Für unsere Zwecke reichen diese Funktionen vollkommen aus.
  
 
Als zweiten Schritt rendert man seine Szene, verarbeitet Tastatureingaben usw.  
 
Als zweiten Schritt rendert man seine Szene, verarbeitet Tastatureingaben usw.  
Also alles was in der Renderschleife passiert.
+
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.
 
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:
 
Die FPS erhält man nun durch folgende Berechnung:
 
+
<source lang="pascal">FPS = 1000 / Zeitdifferenz;</source>
FPS = 1000 / Zeitdifferenz;
 
  
 
Wobei Zeitdifferenz bei dieser Formel auch in Millisekunden angegeben sein muss.
 
Wobei Zeitdifferenz bei dieser Formel auch in Millisekunden angegeben sein muss.
  
== Methode 2 ==
+
===Methode 2===
  
 
Diese Methode unterscheidet sich kaum von Methode 1.  
 
Diese Methode unterscheidet sich kaum von Methode 1.  
Zeile 24: Zeile 26:
 
#Startzeit bestimmt
 
#Startzeit bestimmt
 
#gerendert
 
#gerendert
#endzeitbestimmt
+
#Endzeit bestimmt
#zeitdifferenz berechnet
+
#Zeitdifferenz berechnet
  
 
Anschließend wird die Zeitdifferenz auf eine Variable TimeCount addiert. Außerdem wird eine Zählvariable für die Frames erhöht.
 
Anschließend wird die Zeitdifferenz auf eine Variable TimeCount addiert. Außerdem wird eine Zählvariable für die Frames erhöht.
Zeile 33: Zeile 35:
 
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.
 
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.
  
== Besipielcodes ==
+
==Implementierung==
  
Methode 2:
+
Der folgende Code (passend zu Methode 2) 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.
 
  
procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
+
<source lang="pascal"> procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
 
  begin
 
  begin
 
  //
 
  //
Zeile 52: Zeile 53:
 
   if TimeCount >= 1000 then begin
 
   if TimeCount >= 1000 then begin
 
     Frames:= FrameCount;
 
     Frames:= FrameCount;
     TimeCount:= TimeCount - 1000;
+
     Dec(TimeCount, 1000);
 
     FrameCount:= 0;
 
     FrameCount:= 0;
 
   
 
   
Zeile 59: Zeile 60:
 
   
 
   
 
   Done:= false;
 
   Done:= false;
  end;
+
  end;</source>
 +
==Siehe auch==
 +
[[Frameratenbegrenzung]]
 +
 
 +
[[Kategorie:Anleitung]] [[Kategorie:Technik_oder_Algorithmus]]

Aktuelle Version vom 13. Oktober 2013, 15:40 Uhr

Problemstellung

Die Bildwiederholrate in Frames per Second ist ein in Computerspielen oftmals verwendeter Wert, der eine Aussage über die Leistungsfähigkeit des Computersystems geben kann.
Wenn man in seinem Programm die Frames pro Sekunde (FPS) anzeigen lassen möchte, so gibt es verschiedene Lösungswege.

Ansätze

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" und unter SDL SDL_GetTicks verwenden. Für unsere Zwecke reichen diese 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:

  1. Startzeit bestimmt
  2. gerendert
  3. Endzeit bestimmt
  4. 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.

Implementierung

Der folgende Code (passend zu Methode 2) 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;
     Dec(TimeCount, 1000);
     FrameCount:= 0;
 
     Caption:= InttoStr(Frames) + 'FPS';
   end;
 
   Done:= false;
 end;

Siehe auch

Frameratenbegrenzung