Frames Ö.ö

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

5k41

Betreff: Frames Ö.ö

BeitragMo, Apr 17, 2006 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!
dieser code:
Code: [AUSKLAPPEN]

Graphics 800,600,32,1
SetBuffer BackBuffer()

While Not KeyDown(1)

 time#=MilliSecs()
 If time#-oldTime#<>0 Then FPS#=Int(1000 / (time#-oldTime#))
 If FPS#=0 Then FPS#=1
 oldTime#=MilliSecs()

 Text 0,0,FPS

 Flip
 Cls

Wend

End

läuft bei mir nur unter 37 frames Ö.ö (also manchmal sind och 80 dabei aber 37 ist die zahl die man immer lesen kann).
Liegt es an einem Fehler in der Berechnung oder ist mein Rechner einfach soo schlecht?
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Bud

BeitragMo, Apr 17, 2006 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir zeigt's 71 an...
Hast du deine Bildschirmwiederholrate zu tief gestellt? (Meine ist auf 72...)
Vllt. hast du einfach zu viele Programme im Hintergrund laufen...

5k41

BeitragMo, Apr 17, 2006 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
mh also mein Monitor steht auf 100 Hertz von daher kanns das nicht sein... muss wohl an meinem Rechner liegen, wollte ja nur wissen obs ein Fehler in der Berechnung ist... danke!

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

Dreamora

BeitragMo, Apr 17, 2006 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
FPS würde ich nie so errechnen sondern 999 ms lang eine temporäre Variable raufzählen und dann FPS auf diese Variable setzen, wie man es normalerweise sieht. Deine Variante ist zu sprunghaft was zu massiven Fehlern führt bei FPS abhängigen codes. Auch heisst FPS ja Frames per Second, nicht FPMS Wink
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

5k41

BeitragMo, Apr 17, 2006 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
in etwa so?
Code: [AUSKLAPPEN]

Graphics 800,600,32,1
SetBuffer BackBuffer()

timer=MilliSecs()+999
Dim FPS(1)


While Not KeyDown(1)

 If timer<=MilliSecs() Then FPS(0)=FPS(1):FPS(1)=0:timer=MilliSecs()+999

 If timer>MilliSecs() Then FPS(1)=FPS(1)+1

 Text 0,0,FPS(0)


 Flip
 Cls

Wend

ist das richtig, oder gibts da noch ne elegantere Lösung?
so hab ich immerhin schonmal 50 FPS Wink

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Apr 17, 2006 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmmm, das hier funktioniert.

Code: [AUSKLAPPEN]
 frame=frame+4
 ms=MilliSecs()
 If ms>mt mt=ms+246:fps=frame:frame=0
 Text 0,0,fps

Einfach vor dem Flip kopieren.

5k41

BeitragMo, Apr 17, 2006 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bin nicht so der copy-paste typ und irgendwie erkenne ich hinter deiner lösung keine logik... kannst du das noch ein bisschen erklären?
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Apr 17, 2006 15:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber sicher doch. Very Happy Mir bekannt sich zwei Möglichkeiten um die FPS auszurechnen.

1) Man misst die Zeit zwischen einem Schleifendurchlauf in MS. Diese wird dann edit1: 1000 / Gemessene Zeit genommen. Vorteil: Man hat gleich nach dem zweiten Schleifendurchlauf schon ein Ergebnis und dann jeden Schleifendurchlauf. Nachteil: Die Zahl variiert so stark, daß man letztendlich keine Zahl mehr lesen kann.

2) Man misst zählt innerhalb eines bestimmten Zeitabschnittes die Frames. ZB alle 1000ms, dann wird die gezählte Zahl zur Anzeige gebracht. Vorteil: Genaue Zeitmessung ohne groß 'springenden' Zahlen. Nachteil: Schnelle Änderungen werden nur langsam angezeigt (max. 1 Sekunde warten).

Code: [AUSKLAPPEN]
 frame=frame+4
 ms=MilliSecs()
 If ms>mt mt=ms+246:fps=frame:frame=0
 Text 0,0,fps

Ich habe in meinem Beispiel mich für die zweite Möglichkeit entschieden, nur halt alle 1/4 Sekunde (250ms). Da jetzt bereits alle 1/4 Sekunde abgerechnet wird, muß die Framezahl *4 genommen werden (also frame=frame+4). Wurde die 1/4 Zeit überschritten, dann wird frame zu fps kopiert und frame wieder auf 0 gesetzt. Da es sogut wie nie ganau auf 250 oder 251 kommt, wird bereits bei >250-4=246 abgerechnet um 'genaue' Zahlen zu erhalten.

edit2: Ausserdem habe ich versucht eine Möglichkeit zu finden, die mit einer Stelle im Code auskommt. Also keine Vorbereitenden Zeilen vor einer Hauptschleife etc. auskommt und denoch gute Werte anzeigt...

5k41

BeitragMo, Apr 17, 2006 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
achso! Ok dann ist das ja das gleiche was ich gemacht hab, nur in kürzeren abständen Very Happy

Danke!

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Apr 17, 2006 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Jepp: Aber du hast zwei Zeilen Code (timer=MilliSecs()+999:Dim FPS(1)) vorweg. Mag ich nicht so gerne. Ist aber Geschmackssache, da ich keine Lust habe, ein und das selbe 100mal in 100 verschiedenen Codes zu schreiben, kopiere ich dann einfach die Zeilen und setze sie in aktuelle Codes mit rein...

edit: Ausserdem fragst du zweimal in einem Schleifendurchlauf nach MilliSecs() ab. Würde ich nach Möglichkeit unterlassen.

5k41

BeitragMo, Apr 17, 2006 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
mh ok dann schreib ich mir nun auch mal meine "allrund" lösung^^

~Edit~
Hier ist sie:
Code: [AUSKLAPPEN]

Graphics 800,600,32,1
SetBuffer BackBuffer()

Const intervall=4


While Not KeyDown(1)


 news=MilliSecs()
 If news>old Then FPS=FPSCount:FPSCount=0:old=news+((1000/intervall)-intervall)
 If news<=old Then FPSCount=FPSCount+intervall
 Text 0,0,FPS

 Flip
 Cls

Wend

P.s.:Leider ist mein vorhaben das schön in eine Funktion zu packen gescheitert, da diese sowohl die Variable old als auch FPSCount zurückgeben müsste, damit man sie ihr wieder übergeben kann ohne mit Gloalen zu arbeiten...Sad

~Edit 2~
Oha! Wenn man eine Taste nach dem Start des Programmes drückt fallen die Frames bei mir von 52 (auch schon sau wenig Ö.ö) auf 4! Ist aber auch irgendwie nur bei allerersten Tastendruck... mh
 

fliege

BeitragMo, Apr 17, 2006 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Da gabs doch mal was, mit dem konnte man aus zwei Variablen eine machen:
https://www.blitzforum.de/foru...highlight=

Versuchs mal damit, hoffe es hilft dir.

Fliege

5k41

BeitragMo, Apr 17, 2006 16:22
Antworten mit Zitat
Benutzer-Profile anzeigen
hachja bitshiftig... hat mich bei directdraw schon immer so aufgeregt Very Happy ne so wichtig isses auch wieder nicht, zumal millisecs()+999 auch nich zu schiften sein sollte...

mfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

5k41

BeitragSo, Apr 23, 2006 11:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!
Sorry das ich diesen Thread nochmal aufgreife, aber irgendwas an meiner Berechnung muss falsch sein, ich find den Fehler aber nicht... :-/
Er zeigt bei mir dauerhaft 52 Frames an, ob ich meine Skyboxsymulation, nur die FPS anzeige oder meine GUI in der Hauptschleife hab... kann mir irgendwer helfen?

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image
 

Dreamora

BeitragSo, Apr 23, 2006 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Und was ist daran genau falsch? Vielleicht synct dein Bildschirm einfach auf einer so niedrigen Frequenz? Versuch mal flip false ...
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSo, Apr 23, 2006 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, hier ist mal meine Standard FPS Brerechnung für BB2D und BB3D, normal immer als Include Datei
BlitzBasic: [AUSKLAPPEN]
;Include ("D:\BB Includes\BB2D\FPS.bb")
Dim FPS(2)
Function FPS_Anzeige(x,y)
Text x,y,"FPS:"+FPS(0)
FPS(1)=FPS(1)+1
If MilliSecs()>FPS(2)+999 Then
FPS(0)=FPS(1)
FPS(1)=0
FPS(2)=MilliSecs()
End If
End Function
;
;
Graphics 800,600
SetBuffer BackBuffer()

While Not KeyDown(1);####
Cls
;
;
;
FPS_Anzeige(10,10)
If KeyDown (33) Then ; TASTE "F"
Flip 0
Else
Flip
End If
Wend;#####
End


Und das mit Standart Code dann kannste das gleich ausprobieren ob es am Monitor liegt!
Bei gedrückter F-Taste werden die Buffer sofort getauscht!
Wenn es für Bplus sein soll, dann sollte man die Fps Anzeige mit BitmapFont texten, da Text bei Bplus saulangsam ist!
[BB2D | BB3D | BB+]
 

D²O

BeitragSo, Apr 23, 2006 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
hier meine 2cents,
ein Array und eine funktion dazu.


Code: [AUSKLAPPEN]
Graphics 800,600,32,2
SetBuffer BackBuffer()

Dim getfpstime(4) ;ist für die Funktion getfps notwendig

   Function getfps%(l_in = 1000)
      getfpstime(0) = MilliSecs() ;timer
      ;getfpstime(1)            ;timertemp
      ;getfpstime(2)            ;ausgabe
      ;getfpstime(3)            ;counter
      getfpstime(3) = getfpstime(3) + 1
         If (getfpstime(0)-getfpstime(1))>l_in
            getfpstime(1)= getfpstime(0)
            getfpstime(2) = getfpstime(3)
            getfpstime(3)= 0
         EndIf
         Return getfpstime(2)
       End Function

While Not KeyDown(1)
   Text 0,0,getfps%()

   Flip 1
   Cls
Wend
End
Blitz+; Blitz3d; BlitzMax; GLBasic; Purebasic;
GameMaker Studio 1.4xx; AGK;

5k41

BeitragSo, Apr 23, 2006 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
mhh... ich werds mir auf jedenfall nochmal alles angucken... muss aber nun erstmal an meine Daten... grrr ich hasse PCs

MfG
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group