[Win] Timer im Mikrosekunden-Bereich

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Jolinah

Betreff: [Win] Timer im Mikrosekunden-Bereich

BeitragSo, Nov 22, 2009 2:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group