Seite 1 von 1

FPS??

Verfasst: 27.12.2004 22:08
von Lukas-P
Hallo,

wie bekomm ich die aktuelle Frame Rate in einem 2D Spiel (mit Sprites und Sprite3Ds) raus?

Verfasst: 27.12.2004 22:27
von AndyX
Hmmm... :? Ich denke, das könnte man so machen, indem man zu anfang der Hauptschleife die seit dem Systemstart vergangenen Millisekunden (ElapsedMilliseconds()) herausfindet [starttime], dasselbe zu Schluss der Schleife [stoptime], dann das vom Schluss minus das vom Anfang [stoptime - starttime = vergangene ms] , dann noch 1000 durch die vergangenen millisekunden dividieren. Das müsste gehen. Ich glaub es steht auch in der Hilfe, kannst ja mal nachsschauen. Ich hoffe, das hilft dir. :)

Tschüss,
AndyX

Verfasst: 27.12.2004 23:03
von Lukas-P
hmm..

nur bei mir kommt da immer 0 raus.

Code: Alles auswählen

Repeat

start=ElapsedMilliseconds()

Code...

stop=ElapsedMilliseconds()

clearscreen(0,0,0)

fps=start-stop
fps=fps/1000
StartDrawing(ScreenOutput())
DrawText(Str(fps)+"FPS")
StopDrawing()

FlipBuffers()


Until KeyboardPushed(#PB_KEY_ESCaPE)

Verfasst: 27.12.2004 23:05
von MVXA
müsst es nich stop-start heißen ? Außerdem finde ich das beispiel etwas weniger effektiv. Schau ins CodeArchiv. da gab es doch Codeschnipsel dazu.

Verfasst: 27.12.2004 23:07
von THEEX
Schau mal im alten Forum nach oder im Codearchiv, da findest bestimmt irgendwas, daß Thema taucht alle paar Monate immer wieder auf...

Verfasst: 28.12.2004 07:52
von DarkDragon
Such mal nach InitGameTimer in diesem und im alten Forum, dürfte dir weiterhelfen, wenn du den Topic findest, den ich meine.

Verfasst: 28.12.2004 11:34
von Lukas-P
Also ich hab das jetzt so:
startfps=ElapsedMilliseconds()
Repeat

..Code...

fps2=fps2+1
If ElapsedMilliseconds()-startfps=>1000
fps=fps2
fps2=0
startfps=ElapsedMilliseconds()
EndIf
StartDrawing(ScreenOutput())
DrawText(Str(fps)+" FPS"
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_KEY_ESCaPE)

Verfasst: 28.12.2004 12:29
von Deeem2031

Code: Alles auswählen

#k = 10
Global fps.f

Procedure FPSCounter(hwnd,nIDEvent,uElapse,lpTimerFunc)
  If fps/#k < 1:SetGadgetText(0,"SPF: "+StrF(#k / fps)):Else:SetGadgetText(0,"FPS: "+StrF(fps / #k)): EndIf 
  While WindowEvent():Wend
EndProcedure

CreateGadgetList(OpenWindow(0,0,0,200,20,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"FPS"))
StringGadget(0,0,0,200,20,"",#PB_String_ReadOnly)
SetTimer_(WindowID(),1,1000,@FPSCounter())
While WindowEvent():Wend

Repeat
  st = timegettime_()
  
  Delay(5); ...
  
  fps - (fps/#k) + (1000/(timegettime_()-st))
Until WindowEvent() = #PB_Event_CloseWindow
Meine "lowmemory"-Variante ;) (braucht nur die fps und st variable)

fps ist allerdings nicht die wirkliche FPS-Anzahl sondern fps/#k.

Verfasst: 29.12.2004 02:30
von ChaOsKid
hi Lukas-P,

ich würde es so machen:

Code: Alles auswählen

Global fps.l, Timer.l

Procedure FPSCounter()
  Zeit = ElapsedMilliseconds()
  If Timer < Zeit
    SetGadgetText(0,"FPS: "+Str(fps))
    Timer = Zeit + 1000
    fps = 0
  EndIf
  fps + 1
EndProcedure

CreateGadgetList(OpenWindow(0,0,0,200,20,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"FPS"))
StringGadget(0,0,0,200,20,"",#PB_String_ReadOnly)

Repeat
  FPSCounter()
  Delay(4)
Until WindowEvent() = #PB_Event_CloseWindow
mfG
Tobi

Verfasst: 30.12.2004 01:01
von THEEX
Hier mal meine aktuelle Methode, wobei ich auch noch andere Benutze...
Aber die hier mißt immer den Durschschnitt innerhalb von 10 Sekunden, wobei man die Zeit natürlich variieren kann....

Code: Alles auswählen

 Procedure.f FpS2()
  Static Start_Zeit, Frames, SendFrames.f
  Zeit_akt = GetTickCount_()
  Frames + 1
  ZeitU = Zeit_akt - Start_Zeit
  If ZeitU
    SendFrames = Frames / ZeitU
  EndIf  
  If Zeit_akt >= Start_Zeit + 10000
    Start_Zeit = Zeit_akt
    Frames = 0
  EndIf
  ProcedureReturn SendFrames * 1000
EndProcedure