Seite 2 von 3

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Verfasst: 02.07.2017 20:41
von ccode_new
Tja scheint wohl ein BUG zu sein ?!

Es sei denn es wissen hier "die Auskenner" besser.

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Verfasst: 03.07.2017 10:56
von #NULL
Im englischen Forum habe ich folgendes gefunden:
http://www.purebasic.fr/english/viewtop ... tframerate (leider in 'Coding Questions', darum wahrscheinlich ignoriert)
http://www.purebasic.fr/english/viewtop ... tframerate
http://www.purebasic.fr/english/viewtop ... tframerate

eventuell mal anderes Subsystem testen.
TroaX hat geschrieben:... 0,4 Pixel. Das geht natürlich nicht (man brauch eine Ganzzahl) ...
Ich würde heutzutage genau aus dem Grund für z.B. Positionen einfach Fliesskommawerte verwenden.

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Verfasst: 06.07.2017 21:35
von PMV
In Zeiten von 240Hz Monitoren muss man solche "Ideen" lesen ...
ich hab kurzeitig das Gefühl gehabt der Thread ist aus dem Jahre 1980. :mrgreen:

... aber billige 2D-Spiele dürfen natürlich auch nen Framelock auf 30 FPS haben ...
Doch wers richtig macht, programmiert Zeitbasiert und macht sich über solche Blödsinn keine sorgen. Auch bei 2D-Spielen. :wink:

Zum Thema des Threads:
Das Verhalten ist arg seltsam. Wenn es "nur" bei exakt der Monitor-Refresh-Rate passiert stinkt das gewaltig nach Treiber oder/ und Hardware. Tatsächlich schreibt ja zxtunes.com, dass bei ihm nur mit der Quadro auftritt ... evt. mal andere Grafikkarte ausprobieren? SetRefreshRate() wird vermutlich nur eine DirectX oder Windows-Funktion direkt aufrufen, ohne viel drum rum.

MFG PMV

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Verfasst: 17.08.2017 09:27
von Fluid Byte
Über 1 Jahr alt der Bug und immer noch nicht gefixt, was macht Fred?

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Verfasst: 17.08.2017 09:28
von RSBasic
Er hat andere Prioritäten. :mrgreen:

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Verfasst: 29.08.2017 19:28
von GPI
Hmm...

Workaround-Möglichkeit:
Überprüf die HZ von Desktop. Wenn die gleich der gewünschten framerate ist, dann aktivier einfach VSync und ende. Warum Ärgern :)

Ich schätze mal, dass das Spiel trotz No Sync die Ausgabe auf den Monitor irgendwie synchronisiert

Code: Alles auswählen

#WIDTH = 800
#HEIGHT = 600
#VSYNC = 0

InitSprite() : InitKeyboard()

OpenWindow(0,0,0,#WIDTH,#HEIGHT,"",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

If #VSYNC
   OpenWindowedScreen(WindowID(0),0,0,#WIDTH,#HEIGHT,0,0,0)
Else
   OpenWindowedScreen(WindowID(0),0,0,#WIDTH,#HEIGHT,0,0,0,#PB_Screen_NoSynchronization)   
   SetFrameRate(50) ; 59 geht, 61 geht, 60 geht nicht
EndIf

LoadSprite(0,#PB_Compiler_Home + "\Examples\Sources\Data\Geebee2.bmp")
TransparentSpriteColor(0,RGB(255,0,255))
CreateSprite(1,#WIDTH,#HEIGHT)
StartDrawing(SpriteOutput(1))
For i=0 To #HEIGHT
   c = i * 100 / #HEIGHT
   Box(0,i,#WIDTH,1,RGB(0+c,20+c,50+c))
Next
StopDrawing()

start=ElapsedMilliseconds()
Repeat
   ti=ElapsedMilliseconds()
   FlipBuffers():pics+1
   ti=ElapsedMilliseconds()-ti
   EventID = WindowEvent()
   
   
   ClearScreen(0)
   
   Angle.f + 0.05   
   SX = #WIDTH / 2 - SpriteWidth(0) / 2
   SY = #HEIGHT / 2 - SpriteHeight(0) / 2
   
   DisplaySprite(1,0,i):i+1:If i>100:i=0:EndIf
   
   StartDrawing(ScreenOutput())
   DrawText(0,ti*5,""+ti)
   
   DrawText(100,0,""+StrF(pics/((ElapsedMilliseconds()-start)/1000.1)))
   StopDrawing()
   
   DisplayTransparentSprite(0,SX + Cos(Angle) * 50,SY + Sin(Angle) * 50)
   
Until EventID = #PB_Event_CloseWindow
links springt ja die Anzeige, wie lange das Bild nun gebraucht hat, da sieht man immer 1/60ms-Sprünge drin. Es erfolgt damit immer eine Synchronisation und ich schätze mal, das Fred seine Formel bei FPS=Hz mist baut.


@PMV
definiere billige Spiele. Wenn ein Spiel mit Animationen in 30FPS arbeitet (weil mehr zu erstellen zu aufwendig sind), dann macht es kein Sinn 2000 Bilder die Sekunde zu zeichnen. Das verbraucht nur unnötige CPU-Zeit und erzeugt wärme.
Sinnvoller ist es hier schlicht runterzuregeln. Abhängig von der Monitor-Frequenz.

Die Billigen Spiele mit einen "Bone"-Modell profitieren natürlich von Framefrei. Aber das ist halt kein klassisches 2D.

@TroaX
Auch in klassischen 2D kann man die Koordinaten mit Doubles und Floats berechnen und dann immer bei der Ausgabe runden. Kein Thema.

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Verfasst: 29.08.2017 20:00
von GPI
Eine manuelle Synchronisation zu programmieren ist aber auch kein Problem.

Code: Alles auswählen

#WIDTH = 800
#HEIGHT = 600
#VSYNC = 0

InitSprite() : InitKeyboard()

OpenWindow(0,0,0,#WIDTH,#HEIGHT,"",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

If #VSYNC
  OpenWindowedScreen(WindowID(0),0,0,#WIDTH,#HEIGHT,0,0,0)
Else
  OpenWindowedScreen(WindowID(0),0,0,#WIDTH,#HEIGHT,0,0,0,#PB_Screen_NoSynchronization)   
  ;SetFrameRate(10) ; 59 geht, 61 geht, 60 geht nicht
EndIf


wantedFPS=1000/60

LoadSprite(0,#PB_Compiler_Home + "\Examples\Sources\Data\Geebee2.bmp")
TransparentSpriteColor(0,RGB(255,0,255))
CreateSprite(1,#WIDTH,#HEIGHT)
StartDrawing(SpriteOutput(1))
For i=0 To #HEIGHT
  c = i * 100 / #HEIGHT
  Box(0,i,#WIDTH,1,RGB(0+c,20+c,50+c))
Next
StopDrawing()

start.q=ElapsedMilliseconds()
waiting.q=start
Repeat
  ti=ElapsedMilliseconds()
  FlipBuffers():pics+1
  eventid=WindowEvent()
  
  
  waiting+ wantedFPS
  While ElapsedMilliseconds()<waiting
    ;Delay(0) ; Delay sorgt für unruhige Wartezeiten und ist ungenau!
  Wend
  If ElapsedMilliseconds()-waiting>2000
    waiting=ElapsedMilliseconds()
    Debug "hängt zu lange hinten nach"
  EndIf
  
  ti=ElapsedMilliseconds()-ti
  
  
    
  Angle.f + 0.05   
  SX = #WIDTH / 2 - SpriteWidth(0) / 2
  SY = #HEIGHT / 2 - SpriteHeight(0) / 2
  
    
  ClearScreen(0)

  DisplaySprite(1,0,0)
  
  StartDrawing(ScreenOutput())
  DrawText(0,ti*5,""+ti)
  
  DrawText(100,0,""+StrF(pics/((ElapsedMilliseconds()-start)/1000.1),2)+" - "+waiting+" "+ElapsedMilliseconds())
  StopDrawing()
  
  DisplayTransparentSprite(0,SX + Cos(Angle) * 50,SY + Sin(Angle) * 50)
  
Until EventID = #PB_Event_CloseWindow

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Verfasst: 08.10.2017 15:12
von PMV
GPI hat geschrieben: @PMV
definiere billige Spiele. Wenn ein Spiel mit Animationen in 30FPS arbeitet (weil mehr zu erstellen zu aufwendig sind), dann macht es kein Sinn 2000 Bilder die Sekunde zu zeichnen. Das verbraucht nur unnötige CPU-Zeit und erzeugt wärme.
Sinnvoller ist es hier schlicht runterzuregeln. Abhängig von der Monitor-Frequenz.

Die Billigen Spiele mit einen "Bone"-Modell profitieren natürlich von Framefrei. Aber das ist halt kein klassisches 2D.
Sobald sich Sprites von A nach B bewegen profitiert auch ein 2D-Spiel von höheren Frameraten. 2D Animationen
sind wohl in den meisten Fällen sogar unter 30 Bilder pro Sekunde, diese also als Maß der Dinge zu nehmen ist
also nicht sehr Empfehlenswert. :lol:

Bei "billig" dachte ich vor allem an Causal-Spiele, die vor nem Jahrzehnt aufboomten und nur im Fenstermodus
in einer festen Auflösung gehen. Dürften damals so 800x600 gewesen sein. Tatsächlich bin ich mir aber
sicher, das es solche auch heute noch gibt. Da wird für die 5-10€ Kaufpreis sich aber vermutlich niemand
aus der Zielgruppe beschweren, wenn das Spiel keine 60 Hz unterstützt. :wink:

Wer sich aber Spieleentwickler nennen will, sollte ohne Probleme in der Lage sein, zeitbasierte Bewegung
um zu setzen und dies auch Anwenden ... meine Meinung :wink:

MFG PMV

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Verfasst: 09.10.2017 13:21
von RSBasic
Fluid Byte hat geschrieben:Wenn man mit SetFrameRate() die FPS auf 59 oder 61 setzt passt die Geschwindigkeit. Ist sie genau auf 60 erfolgt gar keine Drosselung und es wird so schnell aktualisiert wie die Hardware es hergibt.
Auf meinem Laptop funktioniert das Festsetzen der Framerate auf 60 und 61, aber auf 59 gibt es erstaunlicherweise keine Drosselung.

\\Edit:
1-58 funktionieren auch, nur 59 nicht. :roll:

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Verfasst: 09.10.2017 17:57
von GPI
Schau doch mal nach, welche Hz eingestellt ist. Mein Media-PC stellt sich gerne mal auf 59Hz.