Seltsam! Komisches Flackern | Frage zu FPS
Seltsam! Komisches Flackern | Frage zu FPS
Hallo!
Im alten Forum hab ich damals geschrieben, daß bei mir ein Sprite, das sich von links nach rechts bewegen soll, total ruckelt. Umso mehr Code ich allerdings habe, umso weniger ruckelt es. Seltsam?
Allerdings!
Aber jetzt hab ich endlich die Lösung gefunden. Und ich kann mir nicht vorstellen, was DARAN logisch sein soll!
Ich hatte ein Delay(1) drin. Aus Spaß hab ich versucht, einfach noch eins reinzumachen, und es funktionierte. Das hat mich erstmal sehr verwundert, dann hab ich einfach mal probiert, anstatt zweimal Delay(1) drin zu haben, einfach ein Delay(2) draus zu machen. Und auf einmal funktioniert es. Wenn ich es übrigens GANZ weglasse, dann ruckelt und zuckelt es noch mehr.
Kann mir jemand erklären, woran das liegen kann?!
Ach ja und noch was bzgl FPS. Irgendwie hab ich hier mal gelesen, daß man das Delay (bei Spielen) nicht per festem Wert an Millisekunden festlegen soll, sondern irgendwie errechnen soll. Was bringt das und wie mach ich das?[/code]
Im alten Forum hab ich damals geschrieben, daß bei mir ein Sprite, das sich von links nach rechts bewegen soll, total ruckelt. Umso mehr Code ich allerdings habe, umso weniger ruckelt es. Seltsam?
Allerdings!
Aber jetzt hab ich endlich die Lösung gefunden. Und ich kann mir nicht vorstellen, was DARAN logisch sein soll!
Ich hatte ein Delay(1) drin. Aus Spaß hab ich versucht, einfach noch eins reinzumachen, und es funktionierte. Das hat mich erstmal sehr verwundert, dann hab ich einfach mal probiert, anstatt zweimal Delay(1) drin zu haben, einfach ein Delay(2) draus zu machen. Und auf einmal funktioniert es. Wenn ich es übrigens GANZ weglasse, dann ruckelt und zuckelt es noch mehr.
Kann mir jemand erklären, woran das liegen kann?!
Ach ja und noch was bzgl FPS. Irgendwie hab ich hier mal gelesen, daß man das Delay (bei Spielen) nicht per festem Wert an Millisekunden festlegen soll, sondern irgendwie errechnen soll. Was bringt das und wie mach ich das?[/code]
Zu deinen ruckelnden Sprites wäre es mal ganz interessant den Code zu sehen... Meine vermutung geht momentan in richtung Rechengeschwindigkeit... Kann aber auch totaler schwachsinn sein was ich mir hier gerade zusammenreime:
Vielleicht durchläuft dein PC die MainLoop einfach viel zu schnell, so dass der Drawing befehl einfach übergangen wird und erst meinetwegen 2 Durchläufe später - somit würde sich das ruckeln erklären lassen... Ob das technisch gesehen überhaupt möglich ist ist wieder die andere Frage (irgendwie bezweifle ich das selbst gerade, aber zumindest isses n denkanstoß ^^)
Und zum Thema FPS:
Was du wahrscheinlich meinst ist das Time-Based-Modelling. Diese Technik sorgt dafür dass das Game auf allen PC's gleichschnell läuft. Bei extrem alten PC's wird ein ruckeln erkennbar sein, aber die Geschwindigkeit bleibt unverändert. Bei hochmodernen PC's erhält man eine äusserst flüssige bewegung.
Das ganze hängt damit zusammen dass in jedem schleifendurchlauf ein Wert errechnet wird mit dem die Sprites bewegt werden, die Distanz die ein Sprite sich bewegen soll wird also nicht mehr absolut angegeben. Je länger natürlich nun ein Schleifendurchlauf dauert, desto größer werden die Sprünge die ein Sprite macht - umgekehrt natürlich analog.
So mal ganz grob beschrieben.
Diese Methode würde sich (falls meine Theorie zutrifft) für dein Projekt durchaus anbieten.
Hier der Link dazu:
http://robsite.de/php/pureboard-archiv/ ... +modelling
Einfach mal durchlesen... Danilo erklärt das ganze ziemlich gut und später ist auch ein Beispiel zu sehen... Auf jedenfall ziemlich hilfreich
Ich hoffe ich konnte helfen oder zumindest den ein oder anderen denkanstoß geben
Mfg
RaVeN
Vielleicht durchläuft dein PC die MainLoop einfach viel zu schnell, so dass der Drawing befehl einfach übergangen wird und erst meinetwegen 2 Durchläufe später - somit würde sich das ruckeln erklären lassen... Ob das technisch gesehen überhaupt möglich ist ist wieder die andere Frage (irgendwie bezweifle ich das selbst gerade, aber zumindest isses n denkanstoß ^^)
Und zum Thema FPS:
Was du wahrscheinlich meinst ist das Time-Based-Modelling. Diese Technik sorgt dafür dass das Game auf allen PC's gleichschnell läuft. Bei extrem alten PC's wird ein ruckeln erkennbar sein, aber die Geschwindigkeit bleibt unverändert. Bei hochmodernen PC's erhält man eine äusserst flüssige bewegung.
Das ganze hängt damit zusammen dass in jedem schleifendurchlauf ein Wert errechnet wird mit dem die Sprites bewegt werden, die Distanz die ein Sprite sich bewegen soll wird also nicht mehr absolut angegeben. Je länger natürlich nun ein Schleifendurchlauf dauert, desto größer werden die Sprünge die ein Sprite macht - umgekehrt natürlich analog.
So mal ganz grob beschrieben.
Diese Methode würde sich (falls meine Theorie zutrifft) für dein Projekt durchaus anbieten.
Hier der Link dazu:
http://robsite.de/php/pureboard-archiv/ ... +modelling
Einfach mal durchlesen... Danilo erklärt das ganze ziemlich gut und später ist auch ein Beispiel zu sehen... Auf jedenfall ziemlich hilfreich
Ich hoffe ich konnte helfen oder zumindest den ein oder anderen denkanstoß geben
Mfg
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Am Code kann es eigentlich nicht liegen, ist ja nix weltbewegendes:
Ich wüßte nicht, weshalb die Buffers an 'ner anderen Stelle geflippt werden sollten. Wenn ich es mittendrin mache, flimmert es ja.
Übrigens, das ist der Code mit Delay(1). Sobald ich Delay(2) mache klappt alles wunderbar. Natürlich in gleicher Geschwindigkeit (ist ja kein großer Unterschied zwischen 1 und 2 ms).
Das mit der Framerate muß ich mir mal nochmal genauer anschauen!
Code: Alles auswählen
Repeat
ClearScreen(0,196,40)
ExamineMouse()
x=x+3
DisplayTransparentSprite(1,x,100)
If x>321
x=-25
EndIf
Delay(1)
FlipBuffers()
Until MouseButton(2)
Übrigens, das ist der Code mit Delay(1). Sobald ich Delay(2) mache klappt alles wunderbar. Natürlich in gleicher Geschwindigkeit (ist ja kein großer Unterschied zwischen 1 und 2 ms).
Das mit der Framerate muß ich mir mal nochmal genauer anschauen!
Also am Code liegts meines erachtens nach wirklich nicht...
Aber mal zu deiner Aussage hier:
Und 1ms delay ist verdammt viel - das nur nebenbei... da kann so ne schleife schon einige male durchlaufen werden (theoretisch gesehen).
Wenn nun also die Framerate bei 2ms wirklich halbiert wird (bitte berichtig mich wenn ich damit falsch liege irgendwie hat sich diese idee gerade in meinem kopf festgekrallt
), dann würde das ganze meine These stützen dass dein Rechner einfach zu schnell ist...
Vergleich das doch einfach mal die uralt games die noch auf 5 1/4" Floppys ausgeliefert wurden. Die meisten davon waren nicht zeitkritisch programmiert, wenn man sie also auf einem rechner gespielt hat der zu schnell war hat man bei moderaten geschwindigkeitsunterschieden die figuren durchaus mal springen sehen, bei krassen unterschieden schienen sie sich mit TransWarp zu bewegen
Hat man dann ne Software bremse verwendet lief alles wieder perfekt...
Iss wie gesagt nur so ne idee... aber evtl möglich
Deswegen wären deine Rechner Daten mal ganz interessant...
So, und ihc hau mich etz aufs ohr, bevor des Zeug richtig zu wirken beginnt und ich hier zugedröhnt irgend nen schwachsinn laber
Mfg + gn8
RaVeN
Aber mal zu deiner Aussage hier:
Wenn ich mich nicht irre besteht da ein sehr große unterschied. Wenn meine Gedanken jetz von den ganzen schmerzmitteln und den anderen Medikamenten die ich nehmen muss nicht völlig wirr sind, dann dürfte sich durch das ändern von 1ms delay auf 2ms die Framerate halbieren.ZeHa hat geschrieben:Übrigens, das ist der Code mit Delay(1). Sobald ich Delay(2) mache klappt alles wunderbar. Natürlich in gleicher Geschwindigkeit (ist ja kein großer Unterschied zwischen 1 und 2 ms).
Und 1ms delay ist verdammt viel - das nur nebenbei... da kann so ne schleife schon einige male durchlaufen werden (theoretisch gesehen).
Wenn nun also die Framerate bei 2ms wirklich halbiert wird (bitte berichtig mich wenn ich damit falsch liege irgendwie hat sich diese idee gerade in meinem kopf festgekrallt
Vergleich das doch einfach mal die uralt games die noch auf 5 1/4" Floppys ausgeliefert wurden. Die meisten davon waren nicht zeitkritisch programmiert, wenn man sie also auf einem rechner gespielt hat der zu schnell war hat man bei moderaten geschwindigkeitsunterschieden die figuren durchaus mal springen sehen, bei krassen unterschieden schienen sie sich mit TransWarp zu bewegen
Hat man dann ne Software bremse verwendet lief alles wieder perfekt...
Iss wie gesagt nur so ne idee... aber evtl möglich
Deswegen wären deine Rechner Daten mal ganz interessant...
So, und ihc hau mich etz aufs ohr, bevor des Zeug richtig zu wirken beginnt und ich hier zugedröhnt irgend nen schwachsinn laber
Mfg + gn8
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
natürlich nicht mittendrinn, aber versuche mal
und mische am besten graphik und andere befehle nicht.
bei mir ruckelt dein code übrigens nicht.
Code: Alles auswählen
Repeat
ExamineMouse()
FlipBuffers()
ClearScreen(0,196,40)
x=x+3
DisplayTransparentSprite(1,x,100)
If x>321
x=-25
EndIf
Until MouseButton(2)
bei mir ruckelt dein code übrigens nicht.
Wie schon im anderen Thread (ich meine, der war von dir, kann mich aber auch irren) hab ich keinerlei ruckler hier. Das ist der code welchen ich verwende:
Code: Alles auswählen
InitMouse() : InitSprite()
OpenScreen(1024, 768, 32, "")
CreateSprite(1, 32, 32)
Repeat
ClearScreen(0,196,40)
x=x+3
DisplaySprite(1,x,100)
If x>321
x=-25
EndIf
FlipBuffers()
ExamineMouse()
Until MouseButton(2) - NicTheQuick
- Ein Admin
- Beiträge: 8812
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Bei einem [c]Delay(1)[/c] hat man [c]1 Frame / 0.001 s = 1000 FPS[/c].
Mit einem [c]Delay(2)[/c] hat man [c]1 Frame / 0.002 s = 500 FPS[/c].
Das ist doch schonmal ein ganz schöner Unterschied.
Aber mal eine andere Frage. Welche Bildwiederholfrequenz hat denn dein Bildschirm, wenn du den Screen im Beispiel öffnest?
Und ruckelt es auch, wenn du VSync ausschaltest, also [c]FlipBúffers(0)[/c] verwendest?
Mit einem [c]Delay(2)[/c] hat man [c]1 Frame / 0.002 s = 500 FPS[/c].
Das ist doch schonmal ein ganz schöner Unterschied.
Aber mal eine andere Frage. Welche Bildwiederholfrequenz hat denn dein Bildschirm, wenn du den Screen im Beispiel öffnest?
Und ruckelt es auch, wenn du VSync ausschaltest, also [c]FlipBúffers(0)[/c] verwendest?
Also...
1) Wenn ich eure ganzen Berechnungen, die ja theoretisch richtig sein sollten, beiseite lege und den Loop ausführe, stelle ich einfach fest, daß die Geschwindigkeit bei 1ms oder 2ms Delay vollkommen GLEICH erscheint. Der einzige Unterschied ist, daß das Sprite hin- und herzuckt anstatt sauber seinen Weg von links nach rechts zu gehen.
2) Wenn ich die Befehle sortiere, also erst alles was mit Grafik zu tun hat und dann erst der Rest, bekomm ich die besten Resultate. Aber auch hier kommt es wieder aufs Delay drauf an, nur daß es hier gerade andersrum ist (bei 2ms ruckelt es, bei 1ms nicht)
3) Zu schnell ist mein Rechner sicherlich nicht, er hat 666 MHz mit 128 MB RAM, ist also schon 4 oder 5 Jahre alt. Aber dann kann ich doch eigentlich davon ausgehen, daß wenn mein Spiel jetzt auf MEINEM Rechner super läuft, daß es dann auf allen schnelleren Rechnern gleich läuft, oder? Oder könnte es sein, daß es irgendwann ZU schnell läuft? Weil Zeit ist ja Zeit, also 1ms warten bedeutet doch auch auf 'nem extrem schnellen Rechner 1ms warten, oder?
4) Wenn ich FlipBuffers(0) verwende, wird mein Sprite auf einmal 5x so schnell, aber leider nicht flüssiger.
5) Meine Bildwiederholfrequenz müßte 85Hz sein. Ich hab einfach die Einstellung "Optimal" genommen, und im Vergleich zu 85Hz sehe ich da keinen Unterschied. Also wird's die wohl sein.
So, also wie gesagt (in Absatz 2), mit der richtigen Anordnung der Befehle scheint sich so einiges machen zu lassen. Auf jeden Fall sage ich erstmal vielen Dank für eure Antworten, in Zukunft werd ich wohl einiges besser hinkriegen. Jetzt hoffe ich aber, daß mir noch einer die Frage Nr. 3 beantworten kann, also ob ich davon ausgehen kann, daß mein Programm wenigstens auf allen SCHNELLEREN Rechnern so läuft, wie ich es ursprünglich designed hab. Auf langsameren muß es ja nicht mehr 100%ig gleichschnell laufen, da heut wahrscheinlich eh fast keiner mehr mit 'nem 200er Pentium oder so arbeitet. Aber wichtig wäre mir halt, daß die ganzen schnellen Rechner, die ja umso mehr verbreitet sind, mein Spiel nicht zuu schnell ablaufen lassen
1) Wenn ich eure ganzen Berechnungen, die ja theoretisch richtig sein sollten, beiseite lege und den Loop ausführe, stelle ich einfach fest, daß die Geschwindigkeit bei 1ms oder 2ms Delay vollkommen GLEICH erscheint. Der einzige Unterschied ist, daß das Sprite hin- und herzuckt anstatt sauber seinen Weg von links nach rechts zu gehen.
2) Wenn ich die Befehle sortiere, also erst alles was mit Grafik zu tun hat und dann erst der Rest, bekomm ich die besten Resultate. Aber auch hier kommt es wieder aufs Delay drauf an, nur daß es hier gerade andersrum ist (bei 2ms ruckelt es, bei 1ms nicht)
3) Zu schnell ist mein Rechner sicherlich nicht, er hat 666 MHz mit 128 MB RAM, ist also schon 4 oder 5 Jahre alt. Aber dann kann ich doch eigentlich davon ausgehen, daß wenn mein Spiel jetzt auf MEINEM Rechner super läuft, daß es dann auf allen schnelleren Rechnern gleich läuft, oder? Oder könnte es sein, daß es irgendwann ZU schnell läuft? Weil Zeit ist ja Zeit, also 1ms warten bedeutet doch auch auf 'nem extrem schnellen Rechner 1ms warten, oder?
4) Wenn ich FlipBuffers(0) verwende, wird mein Sprite auf einmal 5x so schnell, aber leider nicht flüssiger.
5) Meine Bildwiederholfrequenz müßte 85Hz sein. Ich hab einfach die Einstellung "Optimal" genommen, und im Vergleich zu 85Hz sehe ich da keinen Unterschied. Also wird's die wohl sein.
So, also wie gesagt (in Absatz 2), mit der richtigen Anordnung der Befehle scheint sich so einiges machen zu lassen. Auf jeden Fall sage ich erstmal vielen Dank für eure Antworten, in Zukunft werd ich wohl einiges besser hinkriegen. Jetzt hoffe ich aber, daß mir noch einer die Frage Nr. 3 beantworten kann, also ob ich davon ausgehen kann, daß mein Programm wenigstens auf allen SCHNELLEREN Rechnern so läuft, wie ich es ursprünglich designed hab. Auf langsameren muß es ja nicht mehr 100%ig gleichschnell laufen, da heut wahrscheinlich eh fast keiner mehr mit 'nem 200er Pentium oder so arbeitet. Aber wichtig wäre mir halt, daß die ganzen schnellen Rechner, die ja umso mehr verbreitet sind, mein Spiel nicht zuu schnell ablaufen lassen
- NicTheQuick
- Ein Admin
- Beiträge: 8812
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken