[Win] Timer im Mikrosekunden-Bereich
Übersicht

![]() |
JolinahBetreff: [Win] Timer im Mikrosekunden-Bereich |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
Für heutige CPU's ist es oft wünschenswert einen etwas genaueren Timer zu haben als MilliSecs(): Code: [AUSKLAPPEN] Extern "win32"
Function QueryPerformanceCounter:Int(out:Long Ptr) Function QueryPerformanceFrequency:Int(out:Long Ptr) End Extern Type TPerformanceCounter Global _supported:Int = False Global _freq:Long = 0 Global _last:Long = 0 Function IsSupported:Int() Return _supported End Function Function Init() _supported = QueryPerformanceFrequency(Varptr(_freq)) If _supported Then QueryPerformanceCounter(Varptr(_last)) Else _last = MilliSecs() EndIf End Function Function GetDelta:Double() Local now:Long = 0 Local delta:Double = 0 If _supported Then QueryPerformanceCounter(Varptr(now)) delta = (now - _last) / Double(_freq) Else now = MilliSecs() delta = (now - _last) / 1000.0 EndIf _last = now Return delta End Function End Type TPerformanceCounter.Init() Mit IsSupported() kann man prüfen ob der Timer vom jeweiligen System unterstützt wird. Wenn nicht wird doch wieder MilliSecs() verwendet, so dass man die Klasse auf allen Windows-Systemen zum Messen von Zeit verwenden kann. Anwendungsbeispiel: Code: [AUSKLAPPEN] Local timer:TTimer = CreateTimer(60) Local x:Float = 0 Repeat Local move:Float = TPerformanceCounter.GetDelta() Cls x :+ 50 * move DrawRect x, 200, 10, 10 DrawText move, 10, 10 WaitTimer(timer) Flip 0 Until KeyHit(KEY_ESCAPE) Die GetDelta()-Funktion gibt die seit dem letzten Aufruf verstrichene Zeit in Sekunden an. 50 * GetDelta() entspricht dann 50 Pixel / Sekunde. Das GetDelta() sollte jedoch in eine Variable zwischengespeichert werden und nur 1 mal pro Schleifendurchlauf aufgerufen werden. Dieser Timer kann auch genutzt werden um genauer zu messen wie lange ein Code zur Ausführung braucht: Code: [AUSKLAPPEN] TPerformanceCounter.GetDelta()
For Local i:Int = 1 to 100000 Next Local time:Double = TPerformanceCounter.GetDelta() Print "Zeit: " + (time * 1000.0) + " ms" Funktioniert leider nur unter Windows ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group