In der SuFu hab ich nix richtiges zu Systemzeit in Verbindung mit Milisekunden gefunden (ausser das hier: viewtopic.php?t=8051&highlight=systemzeit).
Es gibt ja die Funktion GetTime, diese gibt die Uhrzeit in Sekunden wieder, aber ich hätte sie gerne in Milisekunden.
Wozu das ganze?
Ich möchte Animationen in mein Programm einbauen die folgendermaßen funktionieren:
Die Animation ist ein Objekt und besitzt eine Variable die den Zeitpunkt der Erstellung in Milisekunden speichert (entstand die Animation beispielsweise 13 Minuten nach 17 Uhr + 5 Sekunden + 123 Milisekunden dann ergäbe dies ein Wert von 123+5*1000+13*60000+17*24480000 = 416945123).
Nun wird die Differenz zwischen Enstehungszeit und momentaner Zeit gemessen (z.B.: Wird die Animation nach einigen Renderdurchgängen wieder gezeichnet und es sind 500 ms (also eine halbe Sekunde) vergangen).
Diese Differenz bestimmt dann welche Textur für die Animation gezeichnet wird (z.B.: jede 0,1 Sekunde ein anderes Bild).
In diesem Beispiel würde das 5. oder 6. Bild in der Reihe von Bildern für die Animation gezeichnet.
Im oben genannten Link habe ich folgende Funktionen gefunden:
QueryPerformanceCounter/QueryPerformanceFrequency
Allerdings weiß ich nicht wie ich diese richtig einsetze um die Systemzeit PRÄZISE in Milisekunden zu erfahren.
Man müsste dann natürlich noch eine Abfrage machen ob nicht ein Tag vergangen sein könnte.
Andernfals würde es zu einem Fehler kommen wenn wer in der Nacht 23:59:59 das Programm verwendet und es dann plötzlich 00:00:00 ist.
GetTickCount() gibt dir an, wie lange das System schon läuft (in ms). Läuft aber nur ein paar Wochen lang. GetTickCount64() lässt da mehr zu, aber nur für >Vista.
Beim QueryPerformanceCounter holt man sich zuerst die Frequenz mit QueryPerformanceFrequency(freq) und die Startzeit mit QueryPerformanceCounter(start).
Um dann irgendwann die vergangene Zeit zu bekommen:
Code:
QueryPerformanceCounter(current);
delta:= (current - start) / freq;
Danach kann man start auf current setzen, wenn man das möchte.
Wenn du der Nutzung von SDL nicht abgeneigt bist, so bietet dir dieses genau so eine Funktion ohne Umrechnung usw.
SDL_Getticks gibt die Millisekunden seit Programmstart zurück.
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
SDL_GETTICKS gibt mir das gleiche wie GetTickCount aus (also nicht seit Programmstart sondern scheinbar seit Systemstart).
Auch die QueryPerformanceCount Geschichte funktioniert, dürfte nur einen Haken haben: wenn ich mehrere Animationen gleichzeitig laufen habe die zu unterschiedlichen Zeiten begonnen haben, dann werden diese falsch ausgerechnet.
Zum Thema GetTickCount bzw. SDL_GetTicks: sind diese Funktionen (besonders bei 1. glaube ich es gelesen zu haben) nicht relativ... unpräzise?
Klar sind die unpräzise, der QueryPerformanceCounter aber nicht. Dein Problem verstehe ich auch nicht, was hindert dich daran die Zeit des letzten Animationsupdates zu speichern und dann den Unterschied zur Zeit des neuen Updates zu berechnen? Das gleiche "Problem" gibts auch bei GetTickCount().
Wenn du die Zeit seit Programmstart haben willst speicherst du die Systemzeit beim Programmstart und ziehst die immer von der ermittelten Zeit ab.
... hast natürlich Recht, reiner Denkfehler von mir....
Also danke für die Hilfe, kriegst ein Bienchen von mir.
Kann man eigentlich diesen Zähler auch irgendwie pausieren oder
muss ich das in meinen Algorithmus mit einbauen das er den Startpunkt und den Endpunkt der Pause misst, ihn zu vorherigen Pausen hinzuaddiert und die Gesamtzeit von der Animation abzieht?
Kann man eigentlich diesen Zähler auch irgendwie pausieren oder
muss ich das in meinen Algorithmus mit einbauen das er den Startpunkt und den Endpunkt der Pause misst, ihn zu vorherigen Pausen hinzuaddiert und die Gesamtzeit von der Animation abzieht?
Klar sind die unpräzise, der QueryPerformanceCounter aber nicht.
Die Frage war doch nach einem Counter, der Millisekundengenau ist, oder? Dahingehend ist der SDL-Counter also nicht unpräzise, sondern am Rande der geforderten Präzisität.
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Naja eine Animation mit Nanosekunden hoher Präzision wäre wohl recht überflüssig.
... aber ich glaube ich gleibe bei den Windows-Zähler,
WENN EIN MANN SICH EINMAL FÜR WAS ENTSCHIEDEN HAT, DANN ÄNDERT ER AUCH NICHT SEINE MEINUNG.
(Ich fand den Spruch jetzt so geil passend, ich entschuldige mich aber auch gleich hier bei allen Frauen die sich jetzt missverstanden fühlen. )
"Weil er er unfähig ist, was Neues zu lernen?"
Typisch Frau, muss immer das letzte Wort haben.
Zum Thema:
ich mache ja meine Animationen ja durch eine Anfangszeit Variable und berechne daraus sozusagen den Fortschritt (hab ich mir selbst ausgedacht.
Aber welche Methode ist denn eigentlich üblich?
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Das auge nimmt mehrere Bilder als Bewegung wahr, wenn sie 16-18 verschiedene in der Sekunde geliefert bekommt.
Alles darüber macht die bewegung nur geschmeidiger aber bei 16-18Bildern kann das Auge halt nicht mehr Einzelbild und Bewegung unterscheiden.
Das Auge kann bis zu ~60Bilder pro Sekunde aufnehmen aber das Gehirn verarbeitet nur 16-24 davon.
Sprich du brauchst mindestens 1000ms/16=62,5ms und maximal 1000/60=16,quetsch ms genauigkeit und das macht einfach jeder Timer den es gibt.
Unter Windows nimmt man in der Regel den Ticks Timer und nur bei extremfällen den High Performance Counter.
Unter Linux hat man von hause aus den High Performance Counter in der API verpackt und kann über das gelieferte struct die ms und sekunden errechnen.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.