Re: Screen aktualisiert viel zu schnell trotz SetFrameRate()
Verfasst: 02.07.2017 20:41
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.
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
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) ...
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
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
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.
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.