Registriert: Fr Aug 26, 2011 09:26 Beiträge: 25
Programmiersprache: FreePascal
Zitat:
Hmmmm das kann so doch nicht funktionieren, oder?
Wenn eine reine FPS-Anzeige gebraucht wird ist der Code richtig "gezeichnete Frames" = FPSZ
Die Funktion wird pro Renderdurchgang (nach dem Renderauftruf) ausgeführt - zählt FPSZ hoch - bis Rate erreicht ist -> "Rate"-Frames (also 20) in gemessener Zeit...
... wenn da ein Denkfehler drin ist - ich lasse mich gern belehren
Auf die Gefahr hin, dass ich mich jetzt komplett blamiere (vorausgesetzt der FPS-Counter ist wirklich falsch): -> Timebased Movement
Entscheidend ist hier die vergangene Zeit, seitdem das sich bewegende Objekt zuletzt gezeichnet wurde, also (Ende - Start)
Frequenz hat dabei zwei mögliche Funktionen, je nachdem, wie Start / Ende ermittelt wird:
Verwendet man getTicks ist Frequenz nur der Umrechnungsfaktor 1000 für ms -> Sekunden. Im anderen Fall (QueryPerformanceCounter) bekommt man ja eine Anzahl der Takte seit Computer- bzw. Programm-Start oso und errechnet mit der ermittelten Frequenz (QueryPerformanceFrequency) (1/s) die Zeit. (in s)
Beim Timebased Movement musst du genauso wie bei den FPS die Zeitdifferenz messen. Also immer von einem Start des Frames bis zum Nächsten. Wenn in der Renderfunktion nichts gezeichnet wird, würde auch die Differenz Null sein und die simulierte Zeit würde still stehen. Das wäre so als ob man die Augen schließt und so die Zeit anhalten kann. Was meiner Erfahrung nach aber nicht funktioniert.
Der Faktor sollte doch in etwa so gemessen werden?
Code:
QueryPerformanceCounter(Start);
Render;
QueryPerformanceCounter(Ende);
TimeFaktor = (Ende - Start) / frequenz;
...
TempRotate := TempRotate + 0.2 * TimeFaktor;
Ich habe diesen Thread jetzt nur halb verfolgt, aber ich mische mich trotzdem kurz ein
Du solltest nicht die Zeit messen die dein Aufruf von Render() braucht. Das drumherum, das Betriebssystem usw. braucht ebenfalls Zeit! Was du wahrscheinlich haben willst ist die Dauer eines Frames. D.h. du musst die Zeit messen die vergeht bis du an der selben Stelle des Codes (*) wieder ankommst.
Also etwa so:
Code:
QueryPerformanceCounter(Ende);
if (wirdSindImErstenFrame) then
TimeFaktor := 0; // Start ist nicht initialisiert...also brauchen wir irgendeinen sinnvollen Wert
else
TimeFaktor := (Ende - Start) / frequenz;
Start := Ende;
(*) z.B. der Stelle vor dem Aufruf von Render(), damit du die gemessene Zeit direkt an Render() weitergeben kannst.
Wenn eine reine FPS-Anzeige gebraucht wird ist der Code richtig "gezeichnete Frames" = FPSZ
Die Funktion wird pro Renderdurchgang (nach dem Renderauftruf) ausgeführt - zählt FPSZ hoch - bis Rate erreicht ist -> "Rate"-Frames (also 20) in gemessener Zeit...
Habe den Code nur mal getestet und anhand den Tuts hier muss die frequenz ausgelesen werden. Verwende mal nicht 20 sondern 30 oder so.
Und mit wglSwapIntervalEXT(1) kannst du deine FPS Anzeige prüfen. Steht hier direkt am Anfang vom Thema. Dann sollten 60 FPS raus kommen, das hatte ich bei dir nicht, deswegen die Vermutung das es so nicht stimmen kann.....
Registriert: Fr Aug 26, 2011 09:26 Beiträge: 25
Programmiersprache: FreePascal
Ich kann (momentan) nur unter Linux testen, kann also wglSwapIntervalEXT(1) nicht benutzen, das Linux-Äquivalent ist etwas komplizierter...
Auf jeden Fall kommt die gleiche FPS raus, egal welchen Wert ich für Rate verwende (mit 1 und 30 getestet...)
Und: Ich verwende SDL_getTicks : bekomme also Millisekunden - keine Notwendigkeit für Frequenz, die braucht man ja nur für die Umrechnung
Delta_PerformanceTicks / Frequenz = vergangene Zeit (blöderweise nennt die Wiki den Faktor 1000 für die Umrechnung ms -> Sekunden auch "Frequenz"...)
Um die FPS mit "QueryPerformance..." zu bekommen:
FPS = Delta_PerformanceTicks / Frequenz * Rate
...und das müsste mit den Lösungen hier und der Wiki übereinstimmen.
Wichtig (wurde auch schon angemerkt, trotzdem:) Immer die ganze Zeit zwischen zwei Renderaufrufen bzw. "BufferSwaps" messen. Spätestens bei größeren Projekten braucht Spiellogik, Physik, KI, etc. eine beträchtliche Rechenzeit und die FPS-Zahl wäre viel zu groß...
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
d.l.i.w hat geschrieben:
Delta_PerformanceTicks / Frequenz = vergangene Zeit (blöderweise nennt die Wiki den Faktor 1000 für die Umrechnung ms -> Sekunden auch "Frequenz"...)
Ist gewissermaßen korrekt. Wenn man nicht von ms ausgeht sondern von „Ticks“, dann ist 1000 Hz = 1000 Ticks pro Sekunde der korrekte Umrechnungsfaktor.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.