Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Mai 29, 2024 01:54

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
BeitragVerfasst: Fr Jan 20, 2012 22:33 
Offline
DGL Member

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)

Zitat:
TimeFaktor = (Ende - Start) / frequenz;
...
TempRotate := TempRotate + 0.2 * TimeFaktor;


Ist also prinzipiell richtig... (aus der Wiki ?)

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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 20, 2012 23:49 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 21, 2012 10:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Der Faktor sollte doch in etwa so gemessen werden?
Code:
  1.     QueryPerformanceCounter(Start);
  2.     Render;
  3.     QueryPerformanceCounter(Ende);
  4.     TimeFaktor = (Ende - Start) / frequenz;
  5.     ...
  6.     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:
  1. QueryPerformanceCounter(Ende);
  2. if (wirdSindImErstenFrame) then
  3.     TimeFaktor := 0;  // Start ist nicht initialisiert...also brauchen wir irgendeinen sinnvollen Wert
  4. else
  5.     TimeFaktor := (Ende - Start) / frequenz;
  6. Start := Ende;



(*) z.B. der Stelle vor dem Aufruf von Render(), damit du die gemessene Zeit direkt an Render() weitergeben kannst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 21, 2012 19:59 
Offline
DGL Member

Registriert: Di Mai 10, 2011 19:38
Beiträge: 63
ah thx.

d.l.i.w hat geschrieben:
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.....


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 23, 2012 12:18 
Offline
DGL Member

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ß...


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 23, 2012 14:07 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 23, 2012 15:01 
Offline
DGL Member

Registriert: Fr Aug 26, 2011 09:26
Beiträge: 25
Programmiersprache: FreePascal
OK, akzeptiert :mrgreen:

Kann aber auch (unnötigerweise?) Verwirrung stiften, ein Hinweis im Wiki wäre da hilfreich
(darf ich noch nicht editieren... :( )

EDIT: Bezogen auf http://wiki.delphigl.com/index.php/Timebased_Movement


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]