Screen aktualisiert viel zu schnell trotz SetFrameRate()

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Beitrag von ccode_new »

Tja scheint wohl ein BUG zu sein ?!

Es sei denn es wissen hier "die Auskenner" besser.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Beitrag 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.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Beitrag von Fluid Byte »

Über 1 Jahr alt der Bug und immer noch nicht gefixt, was macht Fred?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Beitrag von RSBasic »

Er hat andere Prioritäten. :mrgreen:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Beitrag 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
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Beitrag 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:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()

Beitrag von GPI »

Schau doch mal nach, welche Hz eingestellt ist. Mein Media-PC stellt sich gerne mal auf 59Hz.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten