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.