Weiches Scolling, vsync und co.
Übersicht

![]() |
PSYBetreff: Weiches Scolling, vsync und co. |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hoi,
erstmal vielen Dank für die Antwort ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() L8er, PSY |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group