FPS??

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Lukas-P
Beiträge: 262
Registriert: 07.10.2004 12:03

FPS??

Beitrag von Lukas-P »

Hallo,

wie bekomm ich die aktuelle Frame Rate in einem 2D Spiel (mit Sprites und Sprite3Ds) raus?
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag 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
Benutzeravatar
Lukas-P
Beiträge: 262
Registriert: 07.10.2004 12:03

Beitrag 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)
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Schau mal im alten Forum nach oder im Codearchiv, da findest bestimmt irgendwas, daß Thema taucht alle paar Monate immer wieder auf...
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Such mal nach InitGameTimer in diesem und im alten Forum, dürfte dir weiterhelfen, wenn du den Topic findest, den ich meine.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Lukas-P
Beiträge: 262
Registriert: 07.10.2004 12:03

Beitrag 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)
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
ChaOsKid
Beiträge: 66
Registriert: 29.08.2004 15:07
Wohnort: Oktoberfest

Beitrag 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
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag 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
Antworten