Weiches Scolling, vsync und co.

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

PSY

Betreff: Weiches Scolling, vsync und co.

BeitragFr, Sep 16, 2005 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi Leute,

ich hab da mal ne grundsätzliche Frage.
Es geht um einen Boulderdash-Clone, d.h. auf dem Bildschirm werden einzelne Tiles (32*32) sowie der komplette Bildschirm (beim Scrollen) bewegt.

Folgender Programmaufbau:

Code: [AUSKLAPPEN]

graphics 800,600,16,1

repeat

  WENN alle tiles um 1 feld gescrollt  DANN untersuche gamelogik
  zeichne alle sich bewegenden tiles um 2 pixel in die jeweilige richtung
  setbuffer backbuffer()
  nimm einen 800*600 pixel ausschnitt aus dem imagebuffer und zeichne ihn in den backbuffer
  flip
  setbuffer imagebuffer()

until keydown(1)


Mit diesem Code hab ich ein wirklich butterweiches scrolling, allerdings ist es wegen FLIP an die Monitorfrequenz gekoppelt (beste Spielbarkeit zwischen 70 und 90 Hertz)

Will ich es jetzt Monitorunabhängig mit FLIP 0 machen, folgender Code:

Code: [AUSKLAPPEN]
graphics 800,600,16,1

repeat

  WENN alle tiles um 1 feld gescrollt  DANN untersuche gamelogik
  zeichne alle sich bewegenden tiles um 2 pixel in die jeweilige richtung
  setbuffer backbuffer()
  nimm einen 800*600 pixel ausschnitt aus dem imagebuffer und zeichne ihn in den backbuffer
  repeat
  until millisecs()-timer>13
  timer=millisecs()
  flip 0
  setbuffer imagebuffer()

until keydown(1)


d.h. egal wie lange die Berechnung der Logik in Anspruch nimmt oder egal wielange die Zeichenvorgänge dauern (je nach Level scrollen halt mehr oder weniger Tiles), sobald 13 Millisekunden rum sind wird FLIP 0 ausgeführt. Bei 13 Millisekunden hat man grob 75 Schleifendurchläufe pro Sekunde, also ähnlich wie bei FLIP und nem 75Hz Monitor.

Leider ist bei dieser Lösung das Bild nicht so ganz ruckelfrei. Nach diversen Tests (einfach mal ein Viereck über den Bildschirm flitzen lassen mit FLIP 0) fiel mir die gleiche Problematik auf.

Liegt das allein daran, dass bei FLIP 0 nicht auf vsync gewartet wird?
Wenn das so wäre, gibt es -jedenfalls bei 2D Spielen- keine Möglichkeit, mit FLIP 0 komplett ruckelfrei zu scrollen?


Danke für die Antworten,
L8er,
PSY

Triton

BeitragMi, Sep 21, 2005 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessanter Ansatz, trotzdem rate ich dir - wenn ich das richtig verstanden habe - dir dieses kleine Tutorial durchzulesen:

https://www.blitzforum.de/viewtopic.php?t=3065

Da bleibt man bei Flip 1 und hat somit kein ruckeln oder flackern durch unsyncronität.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

PSY

BeitragDo, Sep 22, 2005 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

erstmal vielen Dank für die Antwort Very Happy

Das Problem bei Flip 1 :
Ich scrolle alle tiles mit 2 pixeln. Bei 72-85 Hz rum sieht das auch super aus. Es sind 32*32 grosse tiles, und bei sagen wir mal 75 Hz wird die Schleife 75 mal in der Sekunde durchlaufen, d.h. 75 Durchläufe * 2 pixel = 150 pixel pro Sekunde die gescrollt werden geteilt durch 32 pixel pro tile macht fast 5 Tiles pro Sekunde. Das ist ok.
Wenn jetzt jemand <72 Hertz hat, wird das Gameplay zu langsam. Folglich muss ich die Anzahl der pixel, um die ich scrolle, erhöhen. Wenn jemand >85 Hertz hat, läuft das Game zu schnell, d.h. ich muss entweder die Anzahl der pixel verringern, oder besser die Schleifendurchläufe verzögern. Beides (<72 und >85) hat aber den Nachteil, dass es nicht mehr 100% flüssig ist.
Mit FLIP 0 wärs natürlich (wie ich oben im ersten Post beschieben hab) am einfachsten zu lösen, aber wie gesagt, auch dann geht das butterweiche Scrolling verloren.

Bei 3D Kram fällt das Ganze nicht so ins Auge, bei 2D Kram, wo viel auf dem Bildschirm passiert auch nicht. Der Nachteil bei nem Boulderdash-Clone ist halt einfach, dass man schonmal länger in eine Richtung läuft + es passiert nicht allzuviel auf dem Screen ---> somit fällt dem menschlichen Auge schnell auf, wenns auch nur 99% ruckelfrei ist.

Deshalb mach ichs folgendermassen:
Der Spieler erhält einen Hinweis, dass das Spiel bei 72-85 Hertz am flüssigsten läuft. Wenn er weniger oder mehr hat, bau ich halt ne Option ein, wo der Spieler vsync deaktiveren kann und brems das Ganze auf ca. 75 Durchgänge pro Schleife von Hand. Es ist dann halt nicht mehr GANZ ruckelfrei, aber egal, es fällt eh kaum auf.

Ist mitterweile auch wohl mehr Einbildung bei mir *gg*


L8er,
PSY

Triton

BeitragDo, Sep 22, 2005 14:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Schreib doch mal ein einfaches, kurzes Beispiel, damit man das besser nachvollziehen kann.

Lösungen direkt mit code sind immernoch am besten.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

PSY

BeitragDo, Sep 22, 2005 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
hoi,

am besten die Montitorfrequenz auf 75Hz stellen...dann haste authentische Umgebung *g*

1. FLIP 1 (ruckelt nicht)

Code: [AUSKLAPPEN]
Graphics 800,600,16,1
SetBuffer BackBuffer()

Repeat
  Cls
  Rect x,50,32,32,1
  x=x+2
  If x>800 Then x=0
  Flip 1
Until KeyDown(1)



2. FLIP 0 timergesteuert (nicht ganz weich, kommt auch so auf 75 Schleifendurchläufe pro Sekunde)
Code: [AUSKLAPPEN]
Graphics 800,600,16,1
SetBuffer BackBuffer()

Repeat
  Cls
  Rect x,50,32,32,1
  x=x+2
  If x>800 Then x=0
  Repeat Until MilliSecs()-timer>13
  timer=millisecs()
  Flip 0
Until KeyDown(1)
End 


Beispiel 2 sollte eigentlich genauso weich laufen wie Beispiel 1. Liegt wohl leider am vsync, dass dem nicht so ist.
Wenn ich aber die Scrollgeschwindigkeit nicht verändern will (also konstant mit 2 pixeln scrollen will), gehts halt nicht anders.
Bei nem Boulderdash-Clone fällts halt wohl ein bischen auf. Ist auch nicht weiter tragisch, aber ich mach's halt wie ich's im vorigen Post beschrieben hab, dann ist das ok Smile

L8er,
PSY

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group