Game Delta-Time
-
Moin,
eine kurze aber doch komplexe Frage, wie genau berechnet man heutzutage die delat time?
ich hatte einen funktionierenden Ansatz mit
#include <time.h> float current = clock(); //do_stuff float delta = (clock() - current) / CLOCKS_PER_SEC;
dann habe ich gelesen dass das unakkurat ist und man das nicht machen sollte, also habe ich mit QueryPerformanceCounter die Zeit geholt, die stimmt aber auf den unterschiedlichen rechnern nicht, scheidet also als delta aus.
Was genau nehme ich nun?
-
Was meinst du mit stimmt nicht? Willst du die Uhrzeit wissen oder Zeit messen? Und wie genau soll es denn sein?
-
QueryPerformanceCounter counts elapsed time, not CPU cycles
Wenn du C++11 verwendest: std::chrono::high_resolution_clock
-
nwp3 schrieb:
Was meinst du mit stimmt nicht?
So wie ich das verstanden habe soll die delta-time doch dafür sorgen, dass auch bei unterschiedlichen frameraten transformationen annähernd linear verlaufen.
Das klappt aber nicht, da auf unterschiedlichen rechnern verschiedene teilweise extreme Geschwindigkeitsunterschiede auftreten.Oder muss da ausser der Zeit von beginn des ersten frames zum beginn des nächsten frames noch etwas anderes berechnet werden?
Geht es hier eigentlich um die realzeit oder die prozesszeit?
nwp3 schrieb:
Willst du die Uhrzeit wissen oder Zeit messen
Die delta time, wie sie in spielen benutzt wird.
-
wahrscheinlich machst du was falsch. Da du nur Code für den clock() ANsatz gezeigt hast, ist aber unmöglich zu sagen, was.
-
In meienr Updatemethode am Anfang des Frames
if(frequency.QuadPart == 0) QueryPerformanceFrequency(&frequency); LARGE_INTEGER elapsed; QueryPerformanceCounter(&elapsed); delta = elapsed.QuadPart - current.QuadPart; QueryPerformanceCounter(¤t);
und wenn ich mir das delta geben lasse eben auch wie beid er clock() version
//deltatime in seconds return delta / ((float)frequency.QuadPart);
und dann eben mit der rotation verrechnen
//begin render loop Time::Update(); //some stuff float delta = Time::DeltaTime(); rotation.X += 0.025f * delta; rotation.Y += 0.05f * delta; rotation.Z += 0.025f * delta; //end render loop
Am Transformationscode liegt es definitiv nicht, da dieser bereits vorab ausgibig getestet wurde. Es liegt hier definitv and en unterschiedlichen Frameraten.
-
Pria schrieb:
...liegt es definitiv nicht...
und was? vielleicht hab ich es im thread ueberlesen, aber ich finde nirgens was das problem ist. nur dass die loesung es nicht loest. waere hilfrech falls du wirklich hilfe moechtest
-
delta = elapsed.QuadPart - current.QuadPart; QueryPerformanceCounter(¤t);
current sollte vor der Benutzung entsprechend initialisiert werden.
realzeit
Ja, weil wir den Bildschirm mit den Augen auch in Realzeit betrachten.
rotation.X += 0.025f * delta; rotation.Y += 0.05f * delta; rotation.Z += 0.025f * delta;
Was bedeuten diese Zeilen? Warum unterscheidet sich die Konstante bei Y? Normalerweise lassen sich Rotationen nicht so schoen linear interpolieren.
-
knivil schrieb:
current sollte vor der Benutzung entsprechend initialisiert werden.
Macht bei einem Frame vorlaufzeit eigentlich keinen Unterschied
knivil schrieb:
Was bedeuten diese Zeilen? Warum unterscheidet sich die Konstante bei Y?
ganz einfach damit sich der cube um die y achse schneller dreht als um die beiden anderen.
-
ok, ich habe jetzt mal die Einheit von Sekunden in Millisekunden geändert, seitdem gehts. Kann sein dass der float Datentyp zu klien geworden ist für die Darstellung des wertes.
Oder Visual Studio hats nicht begriffen das neu zu erstellen, kommt auch öfter mal vor.
-
Vermutlich lieferst du irgendwo int zurück statt float und rundest implizit ab. Deswegen geht nicht, was auch immer nicht geht.