PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Animationen bremsen? OpenGL/GLUT


Ganon
2003-12-03, 17:52:12
Hi.

Ich versuche gerade in meinem kleinen Spiel die Animationen auf jedem Rechner gleich schnell zu machen (d.h. das Öffnen der Tür dauert überall z.B. 2 Sekunden, egal wieviel Frames).

So wie ich bei meinen anderen Problemen schon mitbekommen habe, muss ich die Zeit, die ein Frame braucht, benutzen und einsetzen.

Naja. Zur Zeit sieht es so aus (jetzt mal lückenhaft):


#include <time.h>
#define CLOCKS_PER_SEC 1000

clock_t startzeit, endzeit;
long double AnimaBremse=0.0;

void ZeicheSzene()
{
AnimaBremse = double(endzeit-startzeit)/CLOCKS_PER_SEC;

startzeit = clock();
.
. // Szene zeichnen, alle Animationen werden *AnimaBremse genommen
.
endzeit = clock();
}



Als Wert bekomme ich 0.001. Das war auch der Wert den ich vorher als Platzhalter eingetragen hatte. Jedoch! In 640x480 dauert das öffnen der Tür 2 Sekunden. Stelle ich aber auf 1024x768, dann dauert es 4 Sekunden.

D.h. die ganze Rechnerei bringt nix. Er scheint immernoch 0.001 als Wert zu bekommen.

Was muss ich denn noch machen? Oder mache ich etwas falsch?

Danke! :)

Trap
2003-12-03, 18:35:28
Ich hab mal nach OpenGL und time.h gegoogelt:
http://graphics.stanford.edu/courses/cs248-00/helpsession/opengl/code_example.html
Da ist ein wahrscheinlich funktionierender Codeschnipsel drin.

Ganon
2003-12-03, 19:36:37
Vielen Dank!

Da ist wirklich Code drinnen der funktioniert.

Es sieht jetzt so aus:



#include <time.h>

static struct timeval last_idle_time;
double AnimaBremse=0.0;

void ZeicheSzene()
{
struct timeval time_now;
gettimeofday(&time_now, NULL);
AnimaBremse = (float)(time_now.tv_sec - last_idle_time.tv_sec) + 1.0e-6*(time_now.tv_usec - last_idle_time.tv_usec);
.
. // Szene zeichnen, alle Animationen werden *AnimaBremse genommen
.
last_idle_time = time_now;
}

Demirug
2003-12-03, 20:24:32
Kleiner Tip am Rande:

Animationen und andere Zeitabhängige Funktionen niemals direkt von der PC Uhr abhängig machen. Dafür nimmt man besser ein eigenes Objekt "GameClock". Am Anfang des Frames einmal aktualisieren und dann nur noch den Zeitwert aus diesem Objekt benutzten. Der Vorteil dabei ist das man für alles was in einem Frame passiert die gleiche Zeitbasis hat. Der viel grössere Vorteil ist aber das man das Spiel einfach in einem Pausemodus setzten kann und alle Animationen stehen bleiben indem man einfach die GameClock nicht mehr weiterlaufen lässt. Startet man die Uhr wieder läuft alles ab genau dem Punkt weiter bei dem man gestoppt hat.