![]() |
Exakte FPS
berechne die FPS folgendermaßen
Delphi-Quellcode:
const
BB_FPS_AVERAGE_TIME = 500;
Delphi-Quellcode:
sind die berechneten Frames exakt oder nicht.. procedure GetFramesInSec; begin BB_RenderTime := GetTickCount; BB_CurrentMilliSeconds := GetTickCount; BB_RenderTime := BB_CurrentMilliSeconds; if BB_FPSTime = 0 then BB_FPSTime := BB_CurrentMilliSeconds; if BB_CurrentMilliSeconds - BB_FPSTime >= BB_FPS_AVERAGE_TIME then begin BB_FPS := BB_FPSCounter / (BB_CurrentMilliSeconds - BB_FPSTime) * 1000; BB_FPSTime := BB_CurrentMilliSeconds; BB_FPSCounter := 0; end; Inc(BB_FPSCounter); end; Meine Frage bezieht sich darauf das es ja verschiedene arten der berechnung von FPS gibt. Was ist nun genau ? EDIT: Habe bei 1280x1024 die gleiche Frame anzahl wie in 320x240 .. 40 FPS: Die Frames werden ermittelt in der RenderProc
Delphi-Quellcode:
so wie man mir sagt sollen die Frames unter Vista extrem in den Keller fallen
BbpPluginFunc(BassBoxInfo^);
SongRender; GetFramesInSec; ProgressBarRender; // Refresh display if SwapBuffers(glDc) = True then Result := True; zUpdateWindow(glCtrl, Bool(0)); ReleaseDC(glCtrl, glDc); kanns nicht testen hab kein Vista gruss Emil |
Re: Exakte FPS
Die Frage ist, wie man hier "genau" definiert. Hält man sich exakt an den Wortlaut "Frames per Second", kann man nur rückblickend arbeiten, und schlicht nachzählen wie viele neue Frames in der letzten Sekunde erzeugt wurden. Wenn du möglichst zeitnah als "genau" betrachtest, wäre es sinnvoller die Zeit zu messen, die ein Frame braucht um komplett gerendert zu werden, und dieses dann auf eine Sekunde hochrechnest.
Ein Problem der letzten Variante ist, dass die Zeitdifferenz zwischen vor und nach dem Rendern bei einfachen Szenen so klein werden kann, dass man damit an die Grenzen der Messbarkeit auf einem PC kommt, und dadurch in der Hochrechnung dann ggf. größere Fehler in kauf nehmen muss. Dafür erhält man aber ein Maß, dass sich wirklich nur auf das zuletzt angezeigte Frame bezieht. Das erste Verfahren kann man nun auch noch nach Belieben auf andere Zeiträume anwenden, und anschließens auf eine Sekundenbasis beziehen. Damit kann man dann zwischen "Zeitgenauigkeit" und "Fehlergenauigkeit" hin und her wandern. Andere Möglichkeiten sehe ich prinzipbedingt nicht. Im Extremfall zählt man die Anzahl aller Frames während einer kompletten Laufzeit, sowie die Sekunden die das Programm lief, dividiert diese durcheinander, und hat ein wahnsinnig exaktes Ergebnis. Leider aber erst nach Beendigung des Programmes, und ohne Information über die Verteilung. Der andere Extremfall ist der 2. o.g. Weg. |
Re: Exakte FPS
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:
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.
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; 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. |
Re: Exakte FPS
@littleDave
Danke für das Beispiel ;) Da ihr nicht näher auf meine code eingegangen seid gehe ich davon aus das er die für GetTickCount richtigen werte wieder spiegelt. Mein Problem war halt die aussage das unter Vista fast nichts mehr gehen soll was ich eigentlich nicht so recht glauben mag.. Auch wenn Vista , so wie gehört OpenGl nur Softwaremäßig unterstützt und nicht die Grafikkarte dazu verwendet Leider kann ich die aussage nicht nachvollziehen da ich kein Vista habe. Programmieren für ein system das man nicht hat ist das gleiche wie ein Schuss ins Dunkle. Habe versucht mit diesen Funktionen es unter Vista schneller zu machen. 1. Entfernen von Fulldrag 2. Display größe ändern entfernt macht probleme bei Systemen mit 2 Monitoren. 3. Diese Funktion addiert..
Delphi-Quellcode:
anstelle von
procedure zUpdateWindow (Handle : integer; FlagMode : LongBool);
begin InvalidateRect(Handle, nil, FlagMode); UpdateWindow(Handle); end;
Delphi-Quellcode:
Konnte es aber nicht testen
wglSwapBuffers(glDc)
gruss Emil |
Re: Exakte FPS
Also wenn die Framerate imemr gleich ist würde ich vermuten, dass du
a) eine andere Bremse hast b) VSync aktiviert Du kannst dein Projekt ja mal anhängen, damit User, die Vista haben (zum Beispiel ich), es für dich testen können. |
Re: Exakte FPS
Zitat:
Habs schon mal hochgeladen (wieder gelöscht) aber egal .. Zitat:
wenn ja das macht NVidea automatisch aktivieren/deaktivieren Immer gleich ist sie nicht OpenGL verbraucht halt sehr wenig CPU von daher mag das schon stimmen Sie ändert sich ja auch wenn ich das Window ziehe. EDIT: Scheint keiner testen zu wollen habs wieder gelöscht da sonst zu viele verschiedene Versionen von BassVis existieren. gruss Emil |
Re: Exakte FPS
Zitat:
![]() |
Re: Exakte FPS
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Lag also mit meiner vermutung richtig das es um die einstellung der Hardware geht. Werd das mal aktivieren ;) Kann nicht schaden steht bei mir zwar automatisch nur wann es aktiviert wird steht nicht dabei ;) EDIT: gebracht hat es aber nichts. Immer noch 40 FPS gruss Emil |
Re: Exakte FPS
Zitat:
|
Re: Exakte FPS
Zitat:
|
Re: Exakte FPS
Zitat:
Zumal ich eh alle 500ms die FPS abfrage. gruss Emil |
Re: Exakte FPS
hab da ein schnipsel bei Sulaco gefunden mit dem es
möglich ist VSync Softwaremäßig zu aktivieren. Ist nur die frage ob das sinnvoll ist ;)
Delphi-Quellcode:
Auf jedenfall ändert sich nichts bei meiner FPS aktiviert oder nicht.
procedure VBL2(vsync : TVSyncMode);
var i : Integer; begin if WGL_EXT_swap_control then begin i := wglGetSwapIntervalEXT; case VSync of vsmSync : if i<>1 then wglSwapIntervalEXT(1); vsmNoSync : if i<>0 then wglSwapIntervalEXT(0); else Assert(False); end; end; end; gruss Emil |
Re: Exakte FPS
Der Code-Ausschnitt kommt mir irgendwie aus glScene bekannt vor - aber egal.
Für eine Visualisierung ist es auf jedenfall sinnvoll, vSync zu aktivieren. Du willst ja nicht dass die Visualisierung das komplette System benutzt und somit für Laptop-Benutzer die Hölle ist (wegen Batterie). Aber wenn du nur 40 FPS hast, dann wird vSync nichts ändern. vSync ist erst wirklich aktiv, sobald deine FPS-Zahlen größer als die Herz-Zahlen des Monitors werden (bei TFTs: 60Hz-75Hz). Daher ist es egal ob du es nun aktivierst oder nicht - doch für sinnvoll halte ich es immer. Ich hab bei meiner Engine vSync immer an (gibt bei mir zwar nen Developer-Key, der vSync deaktiviert, doch für den Normalbenutzer gibt es nur vSync an - außer er hat im Treiber vSync auf "Immer Aus" gesetzt - dann ist er aber selbst schuld ;-)) |
Re: Exakte FPS
Zitat:
Der Code stammt von Zitat:
Denke aber ist sinnvoll es wieder auszustellen beim beenden des programms oder ändert das etwas an den System einstellungen der hardware ? gruss Emil |
Re: Exakte FPS
Zitat:
|
Re: Exakte FPS
Ok dann weiss ich bescheid und kann die deaktivierung wieder entfernen
Unnötiger code muss nicht sein. gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz