Screen aktualisiert viel zu schnell trotz SetFrameRate()
Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
Tja scheint wohl ein BUG zu sein ?!
Es sei denn es wissen hier "die Auskenner" besser.
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
no Keyboard, press any key
no mouse, you need a cat
Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
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.
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.
Ich würde heutzutage genau aus dem Grund für z.B. Positionen einfach Fliesskommawerte verwenden.TroaX hat geschrieben:... 0,4 Pixel. Das geht natürlich nicht (man brauch eine Ganzzahl) ...
Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
In Zeiten von 240Hz Monitoren muss man solche "Ideen" lesen ...
ich hab kurzeitig das Gefühl gehabt der Thread ist aus dem Jahre 1980.
... 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.
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
ich hab kurzeitig das Gefühl gehabt der Thread ist aus dem Jahre 1980.
... 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.
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
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
Über 1 Jahr alt der Bug und immer noch nicht gefixt, was macht Fred?
Windows 10 Pro, 64-Bit / Outtakes | Derek
Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
Er hat andere Prioritäten.
Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
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
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.
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
@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!
Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
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!
Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
Sobald sich Sprites von A nach B bewegen profitiert auch ein 2D-Spiel von höheren Frameraten. 2D AnimationenGPI 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.
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.
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.
Wer sich aber Spieleentwickler nennen will, sollte ohne Probleme in der Lage sein, zeitbasierte Bewegung
um zu setzen und dies auch Anwenden ... meine Meinung
MFG PMV
Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
Auf meinem Laptop funktioniert das Festsetzen der Framerate auf 60 und 61, aber auf 59 gibt es erstaunlicherweise keine Drosselung.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.
\\Edit:
1-58 funktionieren auch, nur 59 nicht.
Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
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!