Seite 2 von 2

Re: Echte Hz-Angabe? Purearea Source LimitedFPS

Verfasst: 03.02.2012 00:36
von NicTheQuick
ts-soft hat geschrieben:NickTheQuick hat die ganz schnellen Durchläufe übersehen, dann gibt es DivByZero :mrgreen:
Wieso schreiben so viele mich hier immer mit 'k'? >_<

Aber hast Recht. Sowas darf nicht fehlen.

Re: Echte Hz-Angabe? Purearea Source LimitedFPS

Verfasst: 03.02.2012 10:09
von helpy
Hallo zusammen,

Ich habe das bisher immer etwas anders gemacht!
Ich zähle die Frames pro Sekunde und gebe dann die Anzahl der Frames der letzten vollständigen Sekunde aus:

Code: Alles auswählen

Procedure FPS()
	Static NextSecond
	Static Counter
	Static FPS
	Protected Now
	
	Now = ElapsedMilliseconds()
	If Now >= NextSecond
		FPS = Counter
		If NextSecond = 0 : NextSecond = Now : EndIf
		NextSecond + 1000
		Counter = 1
	Else
		Counter + 1
	EndIf
	
	ProcedureReturn FPS
EndProcedure
Der erste Wert steht also erst nach 1s zur Verfügung.

gruß,
guido

Re: Echte Hz-Angabe? Purearea Source LimitedFPS

Verfasst: 05.02.2012 20:44
von Velox
Richtig war das ich einen Code suche / versuche zu programmieren der mir die tatsächlichen (F)rames (P)er (S)econds ausgibt.
Witzig ist allerdings das FPS und Hz irgendwie widersprüchig ist!

Im ernst, also mein Code stammt von folgender Quelle:
(Nutze ich seit ich diesen das erste mal vor langer Zeit gefunden habe)
http://www.purearea.net/pb/CodeArchiv/G ... ate/FPS.pb

Hier nutze ich nur den Teil ab "FPS:".

Schalte ich meinen Monitor auf 100Hz um, läuft das ganze flüssiger, allerdings solange ich unter 1280x1024 oder 1280x720 bleibe. Andernfalls zieht meine inGame Entwickler-Konsole unschön nach.

Die Frage ist also, nützt eine richtige (echte) FPS Anzeige überhaupt bei der Entwicklung von "unschönen nachziehern" oder ist das doch vielleicht nur ein Vergleichswert zwischen verschiedenen Spielern / Usern?

Und (gehört vlt nicht in dieses Thema) wieso verliere ich eigentlich 10-15 Hz sobald ich meine mittels Hardwarebeschleunigung programmierte Entwickler-Konsole öffne?
Bisher konnte ich nur festellen das es am 2DDrawing liegen könnte.

Re: Echte Hz-Angabe? Purearea Source LimitedFPS

Verfasst: 05.02.2012 20:53
von NicTheQuick
Wenn deine Engine mehr FPS macht als dein Bildschirm Hz hat, dann lohnt es sich VSync zu aktivieren, da damit deine FPS runtergedrosselt werden auf die Frequenz des Bildschirms.

Re: Echte Hz-Angabe? Purearea Source LimitedFPS

Verfasst: 05.02.2012 21:06
von Velox
Geht das denn Physisch überhaupt das eine Software die Bildschirmwiderholrate ändern kann? Ich meine als "gezwungene Einstellung" vielleicht schon nur im Laufe der Anwendung?

Wie geschrieben habe ich eine falsche / unechte FPS Ausgabe die in Wirklichkeit die Hz anzeigt und beim öffnen meiner Entwickler-Konsole welche mittels Hardwarebeschleunigung angezeigt wird und dann der Text darin mit 2DDrawing anzeigt.
Nur der Text löst scheinbar die Hz von (Standard von meinem Monitor 85Hz) 85Hz auf etwa 75-70Hz.

Geht das oder hat habe ich da wirklich nur sehr perfomancelastige Programmierung betrieben?

Re: Echte Hz-Angabe? Purearea Source LimitedFPS

Verfasst: 05.02.2012 21:14
von Drago
Hz = Bildwiederholrate (Frequenz in Hz) des Monitors
Jedesmal wenn im Program Flipbuffers () aufgerufen wird,
fordern wird grob erklärt die Graka auf, ein Bild an den Monitor zu schicken.

Natürlich können wir, wenn unser Programm schnell genug ist, mehr Bilder an die
Grafikkarte schicken, als der Monitor anzeigen kann, was wiederum schlecht ist,
da Lücken in dem Bildablauf entstehen.
Andersrum, wenn unser Code halt etwas länger braucht, weil viele Daten zu verarbeiten sind,
sinkt die Framerate.
Ist nicht schlimm, solange es nicht weniger als 25 werden.

Somit ergibt sich :
Hz ist die Anzahl Bilder pro Sekunde die der Monitor darstellen kann.
FPS ist von dem Programm abhängig.
Haben wir z.B. viele Objekte zu zeichnen, Kollisionen zu prüfen u.s.w.,
KANN die FPS sinken.....
( Da wir ja Flipper dann nicht oft genug aufrufen können... :) )

LG Drago

Re: Echte Hz-Angabe? Purearea Source LimitedFPS

Verfasst: 05.02.2012 21:42
von Danilo
Velox hat geschrieben:und beim öffnen meiner Entwickler-Konsole welche mittels Hardwarebeschleunigung angezeigt wird und dann der Text darin mit 2DDrawing anzeigt.
Nur der Text löst scheinbar die Hz von (Standard von meinem Monitor 85Hz) 85Hz auf etwa 75-70Hz.

Geht das oder hat habe ich da wirklich nur sehr perfomancelastige Programmierung betrieben?
2DDrawing, und gerade die Ausgabe von Text, ist sehr langsam.
Dafür solltest Du einen BitmapFont nehmen, also die einzelnen
Buchstaben als Sprites, bzw. alle Buchstaben in ein Sprite und
dann mittels ClipSprite() die jeweiligen Buchstaben anzeigen.

Re: Echte Hz-Angabe? Purearea Source LimitedFPS

Verfasst: 05.02.2012 22:20
von Drago
Hier ein Beispiel, damit du siehst was passiert, wenn das Programm mehr machen muß.
Die Hz bleiben, nur die FPS sinken...

Guckst du....:

Code: Alles auswählen

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitSprite3D() = 0 Or InitSound() = 0 Or InitMouse() = 0
  MessageRequester( "Error", "Can't open DirectX 7 or later", 0 )
  End
EndIf

If OpenScreen( 1024, 768, 32, "Test3D",0) = 0
  MessageRequester( "Error", "Can't open Screen", 0 )
  End
EndIf



EnableExplicit

Define x.l
Define Fr.l
Define FPS.l
Define Time.i
Define Show.b
ExamineDesktops()

Fr = DesktopFrequency( 0 )

Procedure FPS()
  
  Static NextSecond
  Static Counter
  Static FPS
  Protected Now
  
  Now = ElapsedMilliseconds()
  If Now >= NextSecond
    FPS = Counter
    If NextSecond = 0 : NextSecond = Now : EndIf
    NextSecond + 1000
    Counter = 1
  Else
    Counter + 1
  EndIf
  
  ProcedureReturn FPS
  
EndProcedure

Procedure CollCheck()
  Static i.l
  For I = 1 To 100000
  Next
  
EndProcedure

Repeat
  
  ClearScreen( 0 )
  
  StartDrawing( ScreenOutput() )
  
  DrawingMode( #PB_2DDrawing_Transparent )
  FrontColor( RGB( 200, 0, 0 ) )
  
  DrawText( x, 50, "Test")
  DrawText( x, 700, "Test")
  x + 1
  If x > 1024: x = 0: EndIf
  
  FrontColor( RGB( 255, 255, 255 ) )
  DrawText( 360,100, " Spacetaste drücken um zu sehen was passiert ! ")
  DrawText( 350, 300, " Der Monitor hat eine Frequenz von " + Str( Fr ) + " Hz " )
  DrawText( 200, 320, " Und das Programm schafft im Moment " + Str( FPS() ) + " Bilder pro Sekunde an die Grafikkarte zu schicken ." )
  
  
  If Show
    DrawText( 220, 360, " Jetzt braucht das Programm etwas länder, da wir nun die Procedure CollCheck() aufrufen.." )
  Else
    DrawText( 400, 360, " Jetzt hamwa voll Speed " )
  EndIf
  
  StopDrawing()
  
  If Show
    
    CollCheck()
    
  EndIf
  
  FlipBuffers()
  
  ExamineKeyboard()
  
  If KeyboardReleased(  #PB_Key_Space )
    
    If Show
      Show = 0
    Else
      Show = 1
    EndIf
    
  EndIf
  
  
  
Until KeyboardPushed( #PB_Key_Escape )

End