Ich hätte noch das hier anzubieten. Die LinkedList ist nicht das schönste, aber die Implementierung eines Rolling Average ist für FPS einfach super geeignet.
Die Konstante #averaging gibt an über welchen Zeitraum der Durchschnitt berechnet werden soll.
Procedure.f FPS(Calc = #True) ; Calc = #False um den letzten Wert auszulesen ohne neu zu berechnen
#ProcInternal_Max_FPS_Count = 5
Static Dim FPS_Array(#ProcInternal_Max_FPS_Count)
Static Count, Ticks, lastTime
Static ret.f = 0
Protected i, Time
; ===== Prevent low FPS at start =====
; If lastTime = 0
; For i = 0 To #ProcInternal_Max_FPS_Count
; FPS_Array(i) = 60
; Next
; EndIf
; ===== Calc FPS =====
If Calc
Ticks + 1
Time = ElapsedMilliseconds()
If Time - lastTime > 999
FPS_Array(Count) = Ticks
Ticks = 0
lastTime = Time
Count + 1
If Count > #ProcInternal_Max_FPS_Count
Count = 0
EndIf
EndIf
; Durchschnitt der letzten FPS (#ProcInternal_Max_FPS_Count + 1)
ret = 0
For i = 0 To #ProcInternal_Max_FPS_Count
ret + FPS_Array(i)
Next
ret = ret / (#ProcInternal_Max_FPS_Count + 1)
EndIf
ProcedureReturn ret
EndProcedure
; ----- Beispiel -----
If InitSprite()
If OpenWindow(0, 0, 0, 320, 200, "FPS-Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0), 0, 0, 320, 200)
Repeat
StartDrawing(ScreenOutput())
DrawText(0, 0, StrF(FPS(), 2))
StopDrawing()
FlipBuffers()
Until WindowEvent() = #PB_Event_CloseWindow
EndIf
EndIf
EndIf
weil einfach einfach einfach ist ... mach' ich es anders