fps errechnung immer nur stufenweise?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

feuerball11

Betreff: fps errechnung immer nur stufenweise?

BeitragSa, Aug 21, 2010 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
ich habe mal versucht ein fps counter selber zu schreiben (ich weis es gibt genug hier im forum, wil aber selber einen schaffen)

und habe folgenden code:

Code: [AUSKLAPPEN]
timer = CreateTimer(100)
Global tmp#,tmp2#,fps#
Repeat

set()

WaitTimer(timer)
check()
Until KeyHit(1)


Function set()
tmp = MilliSecs()
End Function

Function check()
tmp2# = MilliSecs()
If tmp2#-tmp# <> 0 Then
fps# = (1000/(tmp2#-tmp#))
EndIf
Print fps#
End Function



nun die frage. warum kommen dort immer ergebnisse wie 100 oder 125 raus und nichts ungerades?

Xeres

Moderator

BeitragSa, Aug 21, 2010 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
fps# behält so lange seinen alten Wert, bis er neu berechnet wird; tmp2#-tmp# <> 0 - ich würde einen anderen Ansatz wählen, bei dem man nicht so auf die Division mit Null aufpassen muss.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ToeB

BeitragSa, Aug 21, 2010 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil [[Millisecs()]] nur einen Integer wiedergibt, keinen Float.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

feuerball11

BeitragSa, Aug 21, 2010 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
tmp2#-tmp# <> 0 musste ich reinmachen, da sons fehler komtm weil ich durch null teile.

was für mich eh unverständlich is, da ich ja waittimer drinn habe...

Xeres

Moderator

BeitragSa, Aug 21, 2010 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Mh... funktioniert auch ohne die Sicherung. Endweder ich bekomme immer 100.0 oder 83,333 und 125.0 im Wechsel... Sind wohl Rundungsfehler - mit Integer wie ToeB schreibt, gibt's immer dieselben, glatten Werte.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

feuerball11

BeitragSa, Aug 21, 2010 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
gut. verstanden..

nun hab ich nen anderes problem...

ich habe ne funktion geschrieben, aber die gibt immer Invinity fps an...

ich kann einfach nicht finden warum Sad

Code: [AUSKLAPPEN]
Graphics 800,600,0,2


timer = CreateTimer(100)


Global tmil#,tmil2#
Global count,tcount#,ghfg#,yfgh
Global asd[3]
Global check
Global yfghi = CreateImage(800,390)


;--------hauptschliefe


Repeat
WaitTimer(timer)
check_fps()
Until KeyHit(1)




Function check_fps()

;---------fps prüfung
   
   
   ;-------variablen setzung
   tmil2# = MilliSecs()
   ghfg# = (1000/(tmil2#-tmil#))
   
   ;----hud
   Cls
   Text 10,50,ghfg#
   yfgh = yfgh + 1
   If yfgh > 800 Then
   yfgh = 0
   SetBuffer ImageBuffer(yfghi)
   Cls
   SetBuffer BackBuffer()
   EndIf
   SetBuffer ImageBuffer(yfghi)   
   Plot yfgh,(390-ghfg)
   Line 0,1,800,1
   Line 0,389,800,389
   SetBuffer BackBuffer()
   DrawImage yfghi,0,200
   Flip
   ;---------hud ende

   
   ;-------variablen setzung 2
   tmil# = MilliSecs()
   
;-----prüfung ende


End Function



tät mich freuen wenn mir jemand meinen fehler aufzeigt...

Xeres

Moderator

BeitragSa, Aug 21, 2010 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Infinity entsteht, wenn du durch unendlich kleine Werte (rund Null) Teilst. Wenn du tmil und tmil2 als Integer deklarierst, bekommst du den entsprechenden Fehler.
Wenn der Timer nicht zwischen den Beiden verschiedenen Variablenzuweisungen liegt, vergeht keine Millisekunde, was in der Rechnung tmil2 - tmil = 0 ergibt...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

feuerball11

BeitragSa, Aug 21, 2010 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
aber ich habe doch wie folgt gemacht:


repeat

timer

var2

rechnung

vari

until ...


also is zwischen vari und var 2 der timer.. also müste zeit vergehen oder???

Xeres

Moderator

BeitragSa, Aug 21, 2010 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, die Rechnung liegt zwischen den Variablen - nicht das warten auf den Timer.
Die Rechnung wird näherungsweise in 0 ms abgehandelt.
Setze ein Delay ein und vergleiche:
BlitzBasic: [AUSKLAPPEN]
Delay(100)
tmil2# = MilliSecs()
ghfg# = (1000/(tmil2#-tmil#))
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

feuerball11

BeitragSa, Aug 21, 2010 20:57
Antworten mit Zitat
Benutzer-Profile anzeigen
mit delay ist es dann:


....
vari
until
timer
delay
var2
rechnung
...


dürfte da nicht shcon der timer reichen???


ich weis immernochnicht wo das problem ist.. kann mir das jemand erklären??

Xeres

Moderator

BeitragSa, Aug 21, 2010 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Du willst:

{
Startzeit

Schleifeninhalt, Timer

Endzeit
Berechung der Differenz
}

Du machst:
{
Startzeit

Berechung der Differenz

HUD-Darstellung

Endzeit

Schleifeninhalt, Timer
}

Ist alles etwas verwirrend, deine Variablenbenennung und Konstruktion dazwischen mit HUD und Flip sind für mich grad nicht leicht zu übersehen...
BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,0,2

Local timer = CreateTimer(100)

Global start,ende,fps


Repeat
Cls
DebugLog("Schleife")

start = MilliSecs()
DebugLog("start = "+start)

DebugLog("Hier Arbeit leisten!")

DebugLog("TIMER")
WaitTimer(timer)

ende = MilliSecs()
DebugLog("ende = "+ende)
DebugLog("ende - start = "+(ende-start))
fps = (1000/(ende-start))
Text(10,10,fps)

Flip(0)
Until KeyHit(1)
End
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

feuerball11

BeitragSa, Aug 21, 2010 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ich mache nicht

{
Startzeit

Berechung der Differenz

HUD-Darstellung

Endzeit

Schleifeninhalt, Timer
}


ich mache

{

timer , schleifeninhalt

endzeit

Berechung der Differenz

HUD-Darstellung

startzeit


}

deswegen sollte es doch eig funtzen oder??

weil zwischen start und endzeit leigt die schleife + timer


habe das im code nochmal kommentiert:

Code: [AUSKLAPPEN]
Graphics 800,600,0,2


timer = CreateTimer(100)


Global tmil,tmil2
Global ghfg,yfgh
Global asd[3]
Global check
Global yfghi = CreateImage(800,390)


;--------hauptschliefe


Repeat

; --- schleifeninhalt

WaitTimer(timer)
check_fps()
Until KeyHit(1)




Function check_fps()

;---------fps prüfung
   
   
   ;-------variablen setzung
   

   tmil2 = MilliSecs() ;----endzeit
   ghfg = (1000/(tmil2-tmil))
   
   ;----hud - kann ignoriert werden
   Cls
   Text 10,50,ghfg
   yfgh = yfgh + 1
   If yfgh > 800 Then
   yfgh = 0
   SetBuffer ImageBuffer(yfghi)
   Cls
   SetBuffer BackBuffer()
   EndIf
   SetBuffer ImageBuffer(yfghi)   
   Plot yfgh,(390-ghfg)
   Line 0,1,800,1
   Line 0,389,800,389
   SetBuffer BackBuffer()
   DrawImage yfghi,0,200
   Flip
   ;---------hud ende

   
   ;-------variablen setzung 2
   tmil = MilliSecs() ;--- startzeit
   
;-----prüfung ende


End Function



wenn ich die start und endzeit an die richtige stelle in der schleife setze. also:

Code: [AUSKLAPPEN]
Repeat

; --- schleifeninhalt
tmil = MilliSecs() ;--- startzeit
WaitTimer(timer)
tmil2 = MilliSecs() ;----endzeit
check_fps()
Until KeyHit(1)


dann kommt divided bei zoro...

also scheint der timer defekt zu sein.. oder irre ich mich da??

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group