Thema: Exakte FPS

Einzelnen Beitrag anzeigen

Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#3

Re: Exakte FPS

  Alt 17. Jun 2008, 16:06
Also wenn du es ganz genau haben willst würd ich dir QueryPerformanceCounter ans Herz legen, doch das ist für eine FPS-Berechnung etwas overkill. Die Genauigkeit von GetTickCount hat maximal 1ms, QueryPerformanceCounter hat (CPU-Abhängig) eine Genauigkeit von micro- bis nano-Sekunden. ABER: QueryPerformanceCounter einen Riesen nachteil: bei mehrkernigen Prozessoren kann das Ergebniss komplett falsch werden (KANN!!!). GetTickCount ist unabhängig von den CPUs und hat das Problem somit nicht (dafür halt das 42-Tage-Problem, das kommt aber weniger oft zum Vorschein).

Hier mal ein Beispiel-Template für QueryPerformanceCounter:
Delphi-Quellcode:
var
  iFrequency, iTimePoint1, iTimePoint2 : int64;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  if QueryPerformanceFrequency(iFrequency) = 0 then
    raise Exception.Create('The installed hardware does not support a high-resolution performance counter!');
end;

procedure TForm1.StartTiming;
begin
  QueryPerformanceCounter(iTimePoint1);
end;

// das Ergebnis ist in Sekunden
function TForm1.SecondsSinceStartTiming: double;
begin
  QueryPerformanceCounter(iTimePoint2);
  result := (iTimePoint2 - iTimePoint1) / iFrequency;
end;

procedure TForm1.DoRender;
var aFPSTime : double;
begin
  // Das eigenliche Rendern ausführen
  DoExecRender;
  // Anzahl der Frames erhöhen
  inc(FFrameCount);
  aFPSTime := SecondsSinceStartTiming;
  // die FPS-Berechnung nur 1x pro Sekunde ausführen
  if aFPSTime >= 1.0 then
  begin
    aFramesPerSecond := round(FFrameCount / aFPSTime);
    StartTiming;
  end;
end;
Das Problem ist halt, dass die Performance-Counter für jeden Core unterschiedlich seien können. Um das Problem zu beheben muss man den Thread/Prozess, in dem QueryPerformanceXXXXX aufgerufen wird an eine CPU binden.
Von AMD gibt es ein Tool, mit dem die AMD-Prozessor-Counter synchronisiert werden und es somit zu keinen Fehlern mehr kommen kann, weiß aber gerade nicht, wie das heißt. Ich glaube sogar, dass die neueren CPUs die Counter automatisch synchronisieren, ist aber nur Spekulation. Ich hatte z.B. bei meinem AMD X2 4800+ noch nie Probleme mit QueryPerformanceCounter - auch ohne installiertes AMD-Tool.
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat