Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 23:16

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Uhrzeit in Milisekunden rauskriegen
BeitragVerfasst: So Apr 12, 2009 13:40 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Hallo.

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 14:12 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
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:
  1. QueryPerformanceCounter(current);
  2. delta:= (current - start) / freq;
  3.  


Danach kann man start auf current setzen, wenn man das möchte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 14:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 14:40 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 14:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 15:15 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
AHHHHHHHHHHH....

... hast natürlich Recht, reiner Denkfehler von mir....

Also danke für die Hilfe, kriegst ein Bienchen von mir. :P

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 15:17 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Ja ja, wir alle stehen manchmal auf dem Schlauch :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 15:18 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Hatte oben kurz nochwas reineditiert:

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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 15:38 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Markus hat geschrieben:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 15:44 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mär 30, 2007 18:35
Beiträge: 331
Nein, den QueryPerformanceCounter kann man nicht pausieren, du startest und beendest ihn ja auch nirgendwo.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 15:45 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
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. :D)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 21:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
WENN EIN MANN SICH EINMAL FÜR WAS ENTSCHIEDEN HAT, DANN ÄNDERT ER AUCH NICHT SEINE MEINUNG.

Weil er er unfähig ist, was Neues zu lernen?
Die Frauen-Fraktion

(Tschulligung, konnt ich mir jetzt nicht verkneifen) :wink:
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 22:49 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
"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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 13, 2009 00:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Du bist schon ganz richtig unterwegs, würde ich sagen. Man wird doch noch ein wenig trollen dürfen. 8)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 14, 2009 17:35 
Offline
DGL Member
Benutzeravatar

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

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]