Danke, verwendet aber leider AddWindowTimer() was ich (später) nicht nutzen kann.mk-soft hat geschrieben:Es ist besser mit Frames zu arbeiten um nicht die CPU Last zu hoch zu schrauben...
...
Der Code soll auch bei Fenstern funktionieren die nicht mit PureBasic erstellt wurden.
Hier mal mein Ansatz, leider ist noch was falsch es wird auf ~100 FPS gedrosselt anstatt auf 60!
Code:
Code: Alles auswählen
DeclareModule FPS
Declare.i Init()
Declare.i Count()
Declare.f Delta()
Declare.i Update()
EndDeclareModule
Module FPS
#FPS_60 = 16
#FPS_30 = 33
#FPS_25 = 40
#FPS_80 = 12
#FPS_75 = 13
#FPS_24 = 41
#FPS_20 = 50
#FPS_10 = 100
Structure PERFORMANCE_STRUCT
FrameTarget.q
FrameStart.q
FrameEnd.q
FrameTime.f
Timing.f
FrameCount.i
FPS.i
DeltaTime.f
EndStructure
Global Performance.PERFORMANCE_STRUCT
Procedure.i Init()
With Performance
\FrameTarget = #FPS_60;GEWÜNSCHTE FPS!
\FrameStart = ElapsedMilliseconds()
EndWith
EndProcedure
Procedure.i Count()
ProcedureReturn Performance\FPS
EndProcedure
Procedure.f Delta()
ProcedureReturn Performance\DeltaTime
EndProcedure
Procedure.i Update()
With Performance
If \FrameTime < \FrameTarget
Delay(\FrameTarget - \FrameTime);NICHT KORREKT !?
EndIf
\FrameEnd = ElapsedMilliseconds()
\FrameTime = \FrameEnd - \FrameStart
\DeltaTime = \FrameTime / \FrameTarget
\FrameStart = \FrameEnd
If \Timing > 999
\FPS = \FrameCount
\Timing = 0
\FrameCount = 1
Else
\Timing + \FrameTime
\FrameCount + 1
EndIf
EndWith
EndProcedure
EndModule
If InitSprite()
If OpenWindow(0,0,0,400,400,"TestWindow",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0),0,0,400,400,#False,0,0,#PB_Screen_NoSynchronization);<- KEIN SYNCH!
FPS::Init()
Repeat
ClearScreen($EB8724)
If StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(10,10,"FPS: " + Str(FPS::Count()))
DrawText(10,30,"DLT: " + StrF(FPS::Delta(),2))
StopDrawing()
Else
PostEvent(#PB_Event_CloseWindow)
EndIf
FlipBuffers()
FPS::Update()
Until WindowEvent() = #PB_Event_CloseWindow
EndIf
EndIf
EndIf