http://www.geisswerks.com/ryan/FAQS/timing.html
kam ich drauf, dass die letzendlich vorgeschlagene lösung garnicht so unterschiedlich
von der einfachsten Grundmethode mit nativen PB Befehlen ist.
hier als winzige Demo:
Code: Alles auswählen
; *********
; Demo für Timing auf 30 FPS
EnableExplicit
Define.l FPS, Timer, TimerDuration, TimeGap
Define.l n, t, col
Define.l PX, PY
Define.l EXIT
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"TimerDemo")
; ** ein Sprite erzeugen, damit man auch was sieht
CreateSprite(0,128,128)
StartDrawing(SpriteOutput(0))
For n=0 To 127
col = RGB(64-n/2,128-n,255-n)
LineXY( 63-n, 63 , 63 , 63-n, col)
LineXY( 64+n, 64 , 63 , 63-n, col)
LineXY( 63-n, 63 , 64 , 64+n, col)
LineXY( 64+n, 64 , 64 , 64+n, col)
Next
StopDrawing()
FPS = 30
TimerDuration = 1000 / FPS
PX = 512-64
PY = 384-64
Repeat
; ** Zeit zu beginn des Schleifendurchlaufs rückspeichern
timer = ElapsedMilliseconds()
; **
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
EXIT = 1
EndIf
If KeyboardPushed(#PB_Key_Left)
PX - 4
EndIf
If KeyboardPushed(#PB_Key_Right)
PX + 4
EndIf
If KeyboardPushed(#PB_Key_Up)
PY - 4
EndIf
If KeyboardPushed(#PB_Key_Down)
PY + 4
EndIf
ClearScreen($201008)
DisplaySprite(0,PX,PY)
; ** Aktuelle Differenz zwischen Soll-Zeit ( TimerDuration )
; ** und tatsächlich verstrichener Zeit ermitteln
TimeGap = TimerDuration - (ElapsedMilliseconds() - Timer)
; ** wenn die größer ist als 16 ms, per Delay warten
If TimeGap > 16
; ** ein bißchen weniger warten, Luft lassen
Delay( TimeGap - 10 )
EndIf
; ** den Rest des Wartens überlassen wir FlipBuffers
FlipBuffers(#PB_Screen_SmartSynchronization)
Until EXIT = 1
aber mal ehrlich, wer braucht schon sein Minigame mit 140FPS laufen lassen....
Aktualisierung für PB 4.40
Code: Alles auswählen
; *********
; Demo für Timing auf 30 FPS
; Änderungen für PB 4.40 Jan.2010
EnableExplicit
Define.l FPS, Timer, TimerDuration, TimeGap
Define.l n, t, col
Define.l PX, PY
Define.l EXIT
InitSprite()
InitKeyboard()
OpenScreen(1024,768,32,"TimerDemo", #PB_Screen_NoSynchronization)
; ** ein Sprite erzeugen, damit man auch was sieht
CreateSprite(0,128,128)
StartDrawing(SpriteOutput(0))
For n=0 To 127
col = RGB(64-n/2,128-n,255-n)
LineXY( 63-n, 63 , 63 , 63-n, col)
LineXY( 64+n, 64 , 63 , 63-n, col)
LineXY( 63-n, 63 , 64 , 64+n, col)
LineXY( 64+n, 64 , 64 , 64+n, col)
Next
StopDrawing()
FPS = 30
TimerDuration = 1000 / FPS
PX = 512-64
PY = 384-64
Repeat
; ** Zeit zu beginn des Schleifendurchlaufs rückspeichern
timer = ElapsedMilliseconds()
; **
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
EXIT = 1
EndIf
If KeyboardPushed(#PB_Key_Left)
PX - 4
EndIf
If KeyboardPushed(#PB_Key_Right)
PX + 4
EndIf
If KeyboardPushed(#PB_Key_Up)
PY - 4
EndIf
If KeyboardPushed(#PB_Key_Down)
PY + 4
EndIf
ClearScreen($201008)
DisplaySprite(0,PX,PY)
; ** Aktuelle Differenz zwischen Soll-Zeit ( TimerDuration )
; ** und tatsächlich verstrichener Zeit ermitteln
TimeGap = TimerDuration - (ElapsedMilliseconds() - Timer)
; ** wenn die größer ist als 16 ms, per Delay warten
If TimeGap > 16
; ** ein bißchen weniger warten, Luft lassen
Delay( TimeGap - 10 )
EndIf
; ** den Rest des Wartens überlassen wir FlipBuffers
FlipBuffers()
Until EXIT = 1