Um eine graphische Animation darzustellen brauche ich eine absichtlich verzögerte Darstellung. Diese soll möglichst so realisiert werden, dass auf unterschiedlichen Rechnern und Betriebssystemen (insbesondere Linux und Windows) in etwa die gleiche Animationsgeschwindigkeit erzielt wird.
Meine bisherige Lösung sieht so aus, dass ich kleine Zeitverzögerungen einbaue. Auf meinem Linuxsystem kann ich mittels time.time() ausreichend kleine Zeitintervalle (im zweistelligen Mikrosekundenbereich) messen und das ganze so realisieren, wie ich es gerne hätte.
Nun kann man ja in der Dokumentation dazu nachlesen, dass time.time() auf unterschiedlichen Betriebssystemen durchaus wesentlich ungenauer sein kann. Auf einem Windowssystem kann ich es derzeit aber nicht testen.
Die Empfehlung der Doku - time.clock() - zu verwenden, entfällt für Linux.
Mit dem timeit-Modul habe ich es ebenfalls nicht in der gewünschten Genauigkeit realisieren können.
Die after()-Methode von Tkinter ist mit mind. 1 ms ebenfalls nicht zu gebrauchen.
Frage(n) also:
Ist die Idee mit den eingebauten Wartezeiten für die Animation an sich schlecht? Kann man das anders besser lösen?
Wenn es die beste Lösung ist: Ist time.clock() unter Windows genau genug, um die gewünschten kurzen Zeiten messen zu können?
Edit: time.sleep() habe ich natürlich auch getestet; ist aber zu träge bzw. ungenau, jedenfalls unter Linux.
Bewusste Verzögerung von Prozessen
wer bemerkt denn bitte eine verzögerung um max. 99E-6 sekunden ? wenn deine gesamte animation 1000 schritte hat hat sich die gesamte animationszeit um ~0.1s erhöht, und das für den worst case deiner 2stelligen verzögerung, also im mittel um etwa 0.05s.
wenn also jede mikrosekunde zählt, wozu dann überhaupt eine verzögerung einbauen. und falls doch nicht, kannst nicht an anderer stelle verzögern damit du nicht so kleine intervalle brauchst ?
wenn also jede mikrosekunde zählt, wozu dann überhaupt eine verzögerung einbauen. und falls doch nicht, kannst nicht an anderer stelle verzögern damit du nicht so kleine intervalle brauchst ?
Da eine annähernd "stufenlose" Regelung der Animationsgeschwindigkeit ermöglicht werden soll und die Animation gleichzeitig so flüssig wie möglich ablaufen soll, benötige ich einen möglichst kleinen Basiszeitraum, auf den ich mich stützen kann.
Verzögerungen unter 0.1 ms kann man durchaus wahrnehmen, wenn die Anzahl der Schritte groß genug ist. Aber viel ist das natürlich nicht, das hast du schon recht. Durch Multiplikation mit dem Basisfaktor ergeben sich dann auch Werte über 1 ms; aber dann ist es eben auch schon langsam.
Wie genau ist denn nun time.clock() unter windows?
Vielleicht könnte jemand folgendes mal unter Windows mit time.time() und time.clock() durchführen. Das wäre nett.
Korrektur zum letzten Posting: Mit timeit komme ich etwa auf 0.01 ms herunter.
Verzögerungen unter 0.1 ms kann man durchaus wahrnehmen, wenn die Anzahl der Schritte groß genug ist. Aber viel ist das natürlich nicht, das hast du schon recht. Durch Multiplikation mit dem Basisfaktor ergeben sich dann auch Werte über 1 ms; aber dann ist es eben auch schon langsam.
Wie genau ist denn nun time.clock() unter windows?
Vielleicht könnte jemand folgendes mal unter Windows mit time.time() und time.clock() durchführen. Das wäre nett.
Code: Alles auswählen
>>> import time
>>> "%.3f ms" %(abs(time.time()-time.time())*1000)
'0.006 ms'
habs gerade ein paar mal durchgeführt, das gibt immer 0.0 ms zurück.
edit:
mit time.clock() funktionierts:
edit:
mit time.clock() funktionierts:
Code: Alles auswählen
>>> print "%.5f ms" % (abs(time.clock()-time.clock())*1000)
0.00196 ms
>>> print "%.5f ms" % (abs(time.clock()-time.clock())*1000)
0.00223 ms
>>> print "%.5f ms" % (abs(time.clock()-time.clock())*1000)
0.00168 ms