vernünftige Zeitmessung ( clock() funktioniert nicht so, wie es soll )
-
Hallo!
Ich versuch mich gerade an der 3D-Grafikprogrammierung mit OpenGL und SDL.
Bisher hab ich immerhin schon eine Kamera, die ich mit der Maus frei drehen und mit der Tastatur frei bewegen und rollen (um die Blickrichtungsachse drehen) kann, und ich klatsche fröhlich irgendwelche 3D-Objekte in die Welt, die ich mir dann von allen Seiten angucken kann.
Das funktioniert so weit ganz gut, wenn die Szene komplex genug ist und die Darstellung eines Frames lange genug dauert. Bei zu einfachen Szenen habe ich aber ein Problem mit der Zeitmessung. Die Mausbewegung funktioniert ja unabhängig von der Framezeit, aber die Bewegungen mit der Tastatur sollen gleichförmig sein, d.h., sie werden in Schritten proportional zur verstrichenen Zeit (seit dem letzten Frame) ausgeführt. Das versuche ich folgendermaßen zu bewerkstelligen:
Ich habe die Variablenclock_t curClock; // Aktueller Wert von clock() clock_t lastClock;// Wert von clock() beim letzten Frame double dt; // verstrichene Zeit seit dem letzten Frame in Sekunden (curClock-lastClock)/CLOCK_PER_SECBei jedem Frame passiert folgendes:
if (curClock==clock()) // keine Zeit verstrichen - keine Tastaturbewegung return; lastClock=curClock; curClock=clock(); dt=((double)(curClock-lastClock))/CLOCKS_PER_SEC; // führe Tastaturbewegungen proportional zu dt ausBei genügend komplexen Szenen funktioniert, wie gesagt, alles ganz super. Ich bewege mich mit augenscheinlich gleichförmiger Geschwindigkeit flüssig durch die Gegend. Wenn ich aber zum Beispiel nur ein ganz einfaches Polyeder im Raum habe, das dargestellt werden muss, ist die Bewegung extrem stockend. Nicht, dass ich mich dann in diskreten (also sichtbaren) großen Schritten bewege, sondern ich bewege mich in diskreten winzig kleinen Schritten. Offenbar ist (curClock-clock()) dann nur wenige Male in der Sekunde ungleich 0 und die duch clock() gemessene Zeit vergeht auch insgesamt laaaangsam, obwohl sie doch immer gleich schnell vergehen sollte.
Ich kann mir das nicht so wirklich erklären.
Ich hab auch schon gedacht, dass vielleicht dt einfach zu klein ist und durch Gleitkomma-Ungenauigkeit einfach eine Nullbewegung errechnet wird. (Weiß nicht, ob das realistisch ist - kenn mich mit diesem numerischen Scheiß nicht aus.) Dem habe ich versucht entgegenzuwirken:if (curClock==clock()) // keine Zeit vergangen return; clock_t temp=lastClock; lastClock=curClock; curClock=clock(); dt=((double)(curClock-lastClock))/CLOCKS_PER_SEC; if (dt<=0.02) { // so tun, als ob nichts gewesen wäre curClock=lastClock; lastClock=temp; return; } // Tastaturbewegungen proportional zur verstrichenen Zeit ausführenDas hilft auch nicht, egal wie groß ich die verstrichene Mindestzeit ansetze. Dadurch werden die Bewegungsschritte größer und in gleichem Maß seltener.
Ich weiß nicht, wo jetzt genau der Hund begraben liegt, aber ich komme zu dem Schluss, dass clock() nicht so gut funktioniert. Gibt es da was besseres?
Wie gesagt benutze ich SDL. Vielleicht stellt ja SDL dafür irgendwelche Funktionen zur Verfügung, die besser sind? Ansonsten, wenn's unbedingt systemspezifisch sein muss: Ich benutze Linux.Vielen Dank schon mal
Krecik
-
Krecik schrieb:
Vielleicht stellt ja SDL dafür irgendwelche Funktionen zur Verfügung, die besser sind?
naja, was soll man dazu sagen, ein riesen beitrag oder zwei worte bei google.
-
Danke für den freundlichen Hinweis.
Edit: Falls das jetzt eingeschnappt klingt: So ist es nicht gemeint.
-
Krecik schrieb:
Danke für den freundlichen Hinweis.
Edit: Falls das jetzt eingeschnappt klingt: So ist es nicht gemeint.
mein beitrag klingt nicht weniger eingeschnappt
