Seltsam! Komisches Flackern | Frage zu FPS

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Seltsam! Komisches Flackern | Frage zu FPS

Beitrag von ZeHa »

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]
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

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 :allright:

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
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

ich würde eher vermuten dass dein FlipBuffers an einer ungünstigen stelle passiert, versuche die buffer mal an anderer stelle auszutauschen.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Am Code kann es eigentlich nicht liegen, ist ja nix weltbewegendes:

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)
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!
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Also am Code liegts meines erachtens nach wirklich nicht...

Aber mal zu deiner Aussage hier:
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).
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.
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 ;) :coderselixir:

Mfg + gn8

RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

natürlich nicht mittendrinn, aber versuche mal

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) 
und mische am besten graphik und andere befehle nicht.
bei mir ruckelt dein code übrigens nicht.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

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) 
Benutzeravatar
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

Beitrag von NicTheQuick »

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?
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

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 :o
Benutzeravatar
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

Beitrag von NicTheQuick »

Ein Delay ist natürlich auf jedem Rechner gleich schnell.
Antworten