Zeitmessung in Millisekunden



  • Hallo @all!

    Ich habe folgendes Problem: Ich schreibe zur Zeit ein OpenGL-Spiel und möchte die Millisekunden zwischen den Render-Schleifen messen und benutzen, damit Bewegungen flüssig und auf allen Rechnern gleich schnell laufen.

    Ein weiteres Problem besteht darin, dass der Quellcode unter Windows sowie auch unter Linix compilierbar sein soll.

    Gibt es eine Funktion, mit der man Millisekunden genau messen kann, welche unter Windows sowie auch unter Linux funktioniert?

    Unter beiden OS benutz ich den GCC 4 (unter Windows mit Dev C++ und unter Linux mit KDevelop)

    Greez

    HoloDoc



  • HoloDoc schrieb:

    Gibt es eine Funktion, mit der man Millisekunden genau messen kann, welche unter Windows sowie auch unter Linux funktioniert?

    Du kannst mal clock() versuchen, ich meine aber, dass das nicht sonderlich verlässliche Ergebnisse liefert.
    Unter Windows kannst Du auch QueryPerformanceCounter benutzen, was recht präzise arbeiten sollte. Kannst Du ja über defines regeln.

    Edit: Hmm... Millisekunden liefern wohl aber beide nicht 🙂



  • ab pention geht:

    #ifdef __GNUC__
    inline u64 rdtsc(){
    	u64 r;
    	asm volatile(
    		"rdtsc"
    		:"=A" (r)
    	);
    	return r;
    }
    #endif
    
    #ifdef _MSC_VER
    #pragma warning(push)
    #pragma warning(disable:4035)//Kein Rueckgabewert
    inline u64 rdtsc()
    {
    	_asm rdtsc
    }
    #pragma warning(pop)
    #endif
    

    aber es kommen keine millisekunden raus, sondern prozessortakte. evtl solltest du also erstmal mit

    time_t t=time();//zeit aufnehmen
    while(t==time());//auf sekundenwechsel aktiv warten
    ++t;//und t aktuelaisieren
    u64 cyclesPerSec=-rdtsc();//start messen
    while(t==time());//auf sekundenwechsel aktiv warten
    cyclesPerSec+=rdtsc();//ende messen und ende-start nach cyclesPerSec stopfen
    

    messen, wie schnell ungefähr dein prozessor ist.



  • volkard schrieb:

    ab pention geht:
    [...]

    Wie ich leider letztens schmerzlich feststellen musste, macht das aber nur auf Einprozessor-Maschinen sinn. Sollte man vielleicht im Hinterkopf behalten - so Moore-technisch gesehen 😉



  • 7H3 N4C3R schrieb:

    Edit: Hmm... Millisekunden liefern wohl aber beide nicht 🙂

    Kommt darauf an, wie man es sieht. QueryPerformanceCounter liefert schon Werte, die sich letztendlich in Millisekunden umwandeln lassen. QueryPerformanceFrequency hilft einem dabei.



  • Danke erstmal an alle die bisher gepostet haben.

    @7H3 N4C3R: Clock() liefert wie du schon gesagt hast keine zuverlässigen und genauen Werte (springt bei mir in 2000 oder Mehr Einheitenschritte), QueryPerformanceCounter ist doch nur für Windoof, oder? sollte ja eben für beide gelten....

    @volkard: So wie ich das verstanden habe, würde das ja dann auf meine n Prozessor abgestimmt sein, es sollte aber auf jeder Maschiene gleich schnell laufen, deswegen brauch ich ja millisekunden 😉

    @HumeSikkins: Ich denke kaum ein prvatanwender hat 2 Prozessoren, aber danke 😉

    Mhhh scheinbar gibt es wirklich keine Funktion die unter beiden OS läuft. Scheinbar muss ich unter Windoof CLOCK() und unter Linux gettimeofday() benutzen, Oder weiß einer von euch vll doch noch was ? 🙂



  • @volkard: So wie ich das verstanden habe, würde das ja dann auf meine n Prozessor abgestimmt sein, es sollte aber auf jeder Maschiene gleich schnell laufen, deswegen brauch ich ja millisekunden 😉

    Das hast du wohl etwas falsch verstanden. Dein Prgramm muß halt nur bei jeder initialisierung neu die Ticks/ms messen ume ien Zeitbasis zu haben.
    rdtsc wird soweit ich weiß auf allen aktuelleren Pentium Prozessoren und AMD unterstützt, so daß es eigentlich für Deine Zwecke optimal ist.



  • HoloDoc schrieb:

    @HumeSikkins: Ich denke kaum ein prvatanwender hat 2 Prozessoren, aber danke 😉

    Täusch dich da mal nicht. Der AMD64 X2 hat 2 Prozessorkerne und ist somit als System mit 2 Prozessoren anzusehen. Da hat Hume schon recht 😉

    Das gleiche gilt für Intel da gibt es auch Prozessoren die 2 Kerne haben 😉



  • HoloDoc schrieb:

    Mhhh scheinbar gibt es wirklich keine Funktion die unter beiden OS läuft. Scheinbar muss ich unter Windoof CLOCK() und unter Linux gettimeofday() benutzen

    clock() ist Standard, ist also unter Windows und Linux verfügbar. Aber wie 7H3 N4C3R schon andeutete, für deine Anforderungen wohl nicht unbedingt geeignet.
    Du musst also eine weitere Abstraktionsebene einführen. Und dann solltest du unter Windows die Performance Counter benutzen. Die sind zwar deutlich CPU intensiver als rdtsc, dafür aber ebenfalls sehr präzise und Multi-CPU fähig.



  • hoffe nur dass QueryPerformanceCounter() nicht zu viel CPU frisst, Spiel soll ja auch noch spielbar sein 🙂

    das Thema hat sich dann erledigt.VIELEN DANK AN ALLE!!


Anmelden zum Antworten