PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Zeit!



Nuke
19-07-2003, 21:28
Hi,

ich versuche mich gerade in OpenGL und damit verbunden in C++! Naja! Da eine Animation viel zu schnell abläuft, bräuchte ich einen Timer damit der Code z.B. nur alle 250ms ausgeführt wird.

Nur wie stelle ich das mit C++ an? Ich habe sowas noch nie gemacht!

Danke!:)

BLUESCREEN3D
19-07-2003, 21:33
guckst du hier: man 3 usleep :D

aber es ist keine gute idee, in jedem zyklus 250ms zu warten, weil dann die laenge eines zykluses immernoch von der geschwindigkeit des rechners abhängt - speicher lieber am vor den berechnungen die aktuelle zeit und warte dann nach dem beenden der berechnungen, bis 250ms im verhältnis zu der gespiecherten zeit abgelaufen sind und mach dann mit dem naechsten zyklus weiter - dadurch würde die animation auf jedem pc, dessen hardware reciht um die in echtzeit abzuspielen, gleichschnell laufen

bischi
19-07-2003, 21:34
Weiss nicht, wie das im Detail funktioniert, wollte dir aber noch sagen, dass ein Film 25 Bilder pro Minute hat, somit sind 250ms wohl zu lang. (abzüglich der Zeit, die für das Rendern gebraucht werden)

MfG Bischi

PS: unter Java: Thread.sleep(100); ;)

Nuke
19-07-2003, 21:39
Hi,

ok hätte besser erklären sollen!

Auf Tastendruck soll sich etwas in einer bestimmten Spanne bewegen und dann stoppen! Also einen Punkt von a nach b bewegen.

Nun möchte ich das er den Punkt halt nur alle 250ms um 0.01 nach rechts bewegt!

Ich dachte mir man nimmt die aktuelle Zeit und nimmt dann immer die differenz! Ist die Größer als 250ms dann geht er ab!

Nur wie stelle ich das an? Ich will nicht das ganze Programm anhalten! Schleife mit Zähler ist alles schon vorhanden! Nur zu schnell!

BLUESCREEN3D
19-07-2003, 21:41
lol, während ich meinen post editiert habe, habt ihr beide nochmal gepostet
ist das was ich noch dazugeschrieben habe nicht genau das, was du gerade willst?

Nuke
19-07-2003, 21:46
Ja! Nur WIE!:)

Wie lese ich in C++ die Zeit aus und rechne die in Millisekunden um?

BLUESCREEN3D
19-07-2003, 21:48
finde gerade keine funktion, um eine zeit (z.b. die zeit seit dem systemstart) im millisekunden bereich zu kriegen - weiss die einer?

in der time.h ist nur zeit im sekundenbereich enthalten

BLUESCREEN3D
19-07-2003, 21:55
du suchst die funktion "gettimeofday"

guckst du da: http://cac.engin.umich.edu/resources/software/linux/tuners.html

kleine demo:

#include <sys/time.h>
#include <unistd.h>
#include <iostream>

using namespace std;

int main()
{
struct timeval tv;
struct timezone tz;

for(;;)
{
gettimeofday(&tv,&tz);
cout << tv.tv_sec << " seconds, " << tv.tv_usec << " microseconds" << endl << flush;
}

return(0);
}

Nuke
19-07-2003, 22:20
Hmm,

der Compiler meint:

Teapot.cpp:10: stray '\312' in program
Teapot.cpp: In function `void keyb(unsigned char, int, int)':
Teapot.cpp:72: stray '\312' in program
Teapot.cpp:72: stray '\312' in program
Teapot.cpp:72: stray '\312' in program
Teapot.cpp:72: stray '\312' in program
Teapot.cpp:72: stray '\312' in program

Nuke
20-07-2003, 09:25
Hat keiner ne Idee? Oder wie man das vielleicht anders löst?

bischi
20-07-2003, 09:52
Hab mal meine "alte" C++ Referenz ausgegraben. Dort sagen sie etwas von:

<<Zusätzlich defininiert <time.h> das Makro CLOCKS_PER_SEC, das die Anzahl von Systemuhrticks pro Sekunde angibt.>>

Hab schon lange nichts mehr mit C++ gemacht, also frag mich nicht wie du das anwenden sollst. Vielleicht kannst du aber so auslesen, wieviele Ticks du warten musst, bis deine 250ms vorbei sind.

MfG Bischi

PS: In Java ist dies VIEL einfacher! ;)

wraith
20-07-2003, 10:08
Hier mal die Klasse,dich ich benutze,um die fps zu berechnen.
Da siehst du auch,wie CLOCKS_PER_SEC zu benutzen ist


#ifndef PERFORMANCE_COUNTER_H
#define PERFORMANCE_COUNTER_H

#include <time.h>

class PerformanceCounter
{
private:
int fps;
int counterFps;
float timeCounted;
float elapsedTime;
clock_t start_t,end_t;
PerformanceCounter(const PerformanceCounter&);
PerformanceCounter& operator=(const PerformanceCounter&);
public:
PerformanceCounter() : fps(0),counterFps(0),timeCounted(0.0f),elapsedTime (0.0f) {}
inline void start();
inline void end();
inline int getFps() const;
inline float getTime() const;
};

inline void PerformanceCounter::start()
{
this->start_t = clock();
}

inline void PerformanceCounter::end()
{
this->end_t = clock();
this->elapsedTime = static_cast<float>(this->end_t - this->start_t) / CLOCKS_PER_SEC;
++counterFps;
if((this->timeCounted += this->elapsedTime) >= 1.0f)
this->fps = counterFps,timeCounted -= 1.0f,counterFps = 0;
}

inline int PerformanceCounter::getFps() const
{
return this->fps;
}

inline float PerformanceCounter::getTime() const
{
return this->elapsedTime;
}

#endif



Original geschrieben von bischi

PS: In Java ist dies VIEL einfacher! ;)
Nicht wirklich ^^

BLUESCREEN3D
20-07-2003, 13:23
Original geschrieben von Nuke
Hmm,

der Compiler meint:

Teapot.cpp:10: stray '\312' in program
Teapot.cpp: In function `void keyb(unsigned char, int, int)':
Teapot.cpp:72: stray '\312' in program
Teapot.cpp:72: stray '\312' in program
Teapot.cpp:72: stray '\312' in program
Teapot.cpp:72: stray '\312' in program
Teapot.cpp:72: stray '\312' in program

Mit welchem Befehl hast du versucht, das zu compilieren?

Nuke
20-07-2003, 16:35
Hi,

hat sich erledigt! Es funktioniert jetzt!

Man muss die Animation in eine extra Methode packen! Ohne Schleife; mit globalen Zähler wird das gemacht! Diese Methode ruft man nun in der Methode auf in der die Objekte gezeichnet werden. Bei jedem Durchlauf der gesamten Methode ändert sich das Zeugs!

Wiederum wird diese Methode nun mit glutIdleFunc(<Methode>) zusätzlich aufgerufen!

Nun gehts!

Jetzt mal nen FPS-Counter versuchen!

bischi
20-07-2003, 17:41
Na dann los!!!

MfG Bischi

Nuke
20-07-2003, 18:01
Ui! Nur 850fps! Bei dem bisschen! *ggg*

Naja! Liegt vielleicht am großem Raum! Geht bis 30000.0f! Aber egal! Wir wollen ja nicht gleich Doom3 programmieren! :D

Mal sehen ob ich jetzt Texturen reinbekomme! Eine Kamera währe auch nicht schlecht! Dann ein Raum usw. usw. Effekte usw. usw.!:)

Hab noch viel vor! Ich will das können!:D