amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Doublebuffering oldfashioned... [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

24.09.2004, 17:32 Uhr

whose
Posts: 2156
Nutzer
Hallo!

Ich hab ein interessantes Phänomen entdeckt im Zusammenhang mit
ScrollVPOrt() und WritePixelArray8() und kann es mir nicht wirklich
erklären. Vielleicht kann mir hier jemand sagen, was da passiert?

Also:

Ganz normale Schleife zum Zeichnen des in einem Puffer vorbereiteten Bilds:


void swapscreens(void)
{
WritePixelArray8(&gb_screen->RastPort, 0, (ULONG)gb_screennr * gb_resy, (ULONG)gb_resx -1,
(ULONG)gb_screennr * gb_resy + gb_resy -1, (UBYTE *)gb_chunkybuffer,
&gb_wpa8rastport);
gb_screen->ViewPort.RasInfo->RyOffset = gb_screennr * gb_resy;
WaitTOF();
ScrollVPort(&gb_screen->ViewPort);
}

gb_screennr wird extern zwischen 1 und 0 getoggelt. Normalerweise sollte
diese Art des Doublebufering ja seinen Dienst tun und ein ruhiges
flackerfreies Bild gewährleisten, in dem man bei bewegten Objekten
keine "Geisterbilder" oder "Schatten" der Bewegung sieht.

Leider ists nicht ganz so einfach, denn ausgerechnet mit dieser Methode
bekomme ich bei meinen Software-Sprites Geisterbilder zu sehen, also
das Bild _vor_ der aktuellen Bewegung erscheint noch teilweise im
sichtbaren Bereich.

Nun hab ich ein bißchen rumprobiert, um zu ergründen, warum es nicht
so geht, wie es soll und hab dabei entdeckt, daß ich _ohne_ ScrollVPort()
auf GraKa ein absolut ruhiges Bild _ohne_ Geisterbilder bekomme.

Bin zugegebenermaßen jetzt etwas verwirrt, vor allem, weil die Doku
zu WritePixelArray8() äußerst spärlich ist. Gibts da u.U. Seiteneffekte?

Kann einer von Euch erklären, was hier verkehrt läuft? Wäre für _jede_
Hilfe dankbar.

Grüße


whose

P.S.: Bitte, keine Hinweise auf das Problem der Busgeschwindigkeit zur
GraKa, die ist nämlich _nicht_ das Problem, da die Geisterbilder auch
auf Amithlon und WinUAE auftauchen, die mit Sicherheit genug Bandbreite
zur GraKa bieten ;)


[ - Antworten - Zitieren - Direktlink - ]

27.09.2004, 21:00 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von whose:
code:
gb_screen->ViewPort.RasInfo->RyOffset = gb_screennr * gb_resy;
    WaitTOF();
    ScrollVPort(&gb_screen->ViewPort);


Also mir erscheint es komisch, daß Du zuerst den ViewPort manipulierst, und _dann_ wartest. Die Veränderung und ScrollVPort sollten direkt nach aufeinander folgen. Außerdem sollte man nicht auf Top-Of-Frame warten, denn dann beginnt ja schon die Darstellung auf dem Monitor und Dein Aufruf von ScrollVPort passiert mitten in der Darstellung. Stattdessen wartet man auf Bottom-Of-ViewPort und hat dann mind. die Austastlücke Zeit für die Aktualisierung.
Also eher so:
code:
WaitBOVP(&gb_screen->ViewPort);
  gb_screen->ViewPort.RasInfo->RyOffset = gb_screennr * gb_resy;
  ScrollVPort(&gb_screen->ViewPort);

Hoffe, das hilft weiter.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

27.09.2004, 21:07 Uhr

Holger
Posts: 8116
Nutzer
Nachtrag: Im ursprünglichen Sinne war es evtl. sinnvoll, nach ScrollVPort mittels WaitTOF zu warten, bis die neue CopperListe wirklich aktiv ist, aber zum einen ist das schon zu lange her, so daß ich evtl. Quatsch schreibe, zum anderen ist die Interpretation durch die GraKa-RTG-Systeme eh eine völlig andere Sache.
PPS: Daß Du ohne ScrollVPort() keine Geisterbilder bekommst, kann auch heißen, daß dann gar kein Double-Buffering stattfindet, aber Dank Deines WaitTOF() Dein Programm jedes zweite Frame flimmerfrei auf den Bildschirm bringt.

mfg

[ - Antworten - Zitieren - Direktlink - ]

28.09.2004, 09:19 Uhr

whose
Posts: 2156
Nutzer
Hallo Holger!

Danke für die Erläuterungen, sie waren sehr hilfreich. ScrollVPort() scheint doch nicht die wahre Lösung zu sein ;)

Naja, die Spur, die das Softsprite hinter sich herzieht, wird zwar dank Deiner Tips deutlich kürzer, verschwindet aber leider nicht.

Hab noch ein wenig weiter experimentiert und in ScrollRast eine deutlich schnellere Alternative gefunden. Dummerweise flackert das Bild jetzt dafür ;) Scheint also, als gäbe es für GraKa nur noch die Lösung, daß ich auf WritePixelArray8() verzichte und direkt ins VRAM schreibe. Wenn ich die Ergebnisse meiner Experimente korrekt deute, ist WritePixelArray8() einen Hauch zu langsam um syncron mit dem Bildaufbau bleiben zu können :sleep:

Danke Dir ganz gehörig! :)

Grüße

[ - Antworten - Zitieren - Direktlink - ]

28.09.2004, 11:53 Uhr

bubblebobble
Posts: 707
Nutzer
Mein Tipp:
Vergiss ScrollVPort(), WritePixelArray(), Softsprites
und WaitTOF().

Ich empfehle dir, alles mit BltBitmapRastPort() zu machen.
(Sprites mit der "masked" Variante.
Kannst dir ja mal mein Asteroids anschauen, ob das
deinen Vorstellungen nahe kommt.
(http://asteroids.hd-rec.de)


Das ganze funktioniert so:
Du öffnest einen Screen der doppelt so hoch ist wie
deine sichtbare Fläche und legst auf beide Hälften ein
Window bzw. RastPort drauf. Du berechnest dein Bild
komplett in der unteren, nicht sichtbaren hälfte.
Wenn du fertig bist, schiebst du den kompletten inhalt
mit BltBitmapRastPort auf den sichtbaren bereich.

Dass es auf dem selben Screen ist hat den Sinn, dass
beide Bitmaps im Graka RAM liegen und deshalb ist das
verdammt schnell. Auf AGA/OCS ist das allerdings zu langsam,
aber ab einer CV64 ist das schnell genug.

Du bekommst leider keine Methode hin die auf Graka UND
AGA gut performt, da die Strukur völlig anders ist.
Entweder du entscheidest dich für AGA, dann geht es auf
Graka nicht. Oder für Graka, dann geht es zwar auf AGA,
ist aber langsam.

Dein Timing machst du am bestem mit dem timer.device.
Dann klappts auch mit AOS4 und MOS.

Auf Copperlisten, VBlanks etc. kann man sich bei Grakas
nicht verlassen.

Achja, und noch ein Tipp: Auf Grakas sie Hintergründe retten.
Immer alles neu Zeichnen.
Warum ? AGP schreiben auf Graka: 500MB/sec, lesen: 3MB/sec.
Auch auf einer CV64 ist das schneller, wenn deine Objekte
im Graka RAM liegen. Da blittet auch eine CV64 mit 100MB/sec
anstatt mit 2MB/sec durch den Zorro Slot.

--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de



[ - Antworten - Zitieren - Direktlink - ]

28.09.2004, 12:09 Uhr

whose
Posts: 2156
Nutzer
Hallo Thilo! :)

Ja, Du hattest mir die Sourcen der älteren AsteroidsTR-Version mal geschickt, erinnerst Dich?

Normalerweise würde ich das auch exakt so machen, wie Du es beschrieben hast, aber ging mir ja gerade darum, vollständig _ohne_ Blitter zu arbeiten, um die Funktionsweise bewegter Grafik besser darstellen zu können. Doof war und ist halt nur, daß sich die Grafik so schwer synchronisieren läßt auf GraKa.

Ich brauche keine Wahnsinns-Frameraten dafür, aber ruhig sollte das Bild schon sein, wenn möglich. Mal sehen, wie weit ich mit ScrollRast und direktem Zugriff aufs VRAM komme. Blöderweise scheint WaitTOF() auf GraKa in nahezu allen Fällen einfach durchzurauschen, das machts ziemlich schwierig. WaitBOVP() scheint zwar zu wirken, ist wohl aber auch nicht wirklich synchron zum Rasterstrahl, oder täusche ich mich da?

Aber trotzdem danke für die Tips, immerhin bin ich dadurch schon mal einige Schritte weiter als vorher :)

Grüße


Wolfgang

[ - Antworten - Zitieren - Direktlink - ]

28.09.2004, 13:35 Uhr

bubblebobble
Posts: 707
Nutzer
Weiss nicht mehr, habe so viel um die Ohren momentan.
Vom Prinp hat sich aber an Asteroids nix geändert.

Bei den meisten Grafikkarten gibt es keinen VBlank,
drum kann man auch nicht darauf warten. Wenn WaitTOF()
funktioniert, dann hat das nix mit dem VBlank zu tun sondern
es wurde eben ein beliebiger Timer implementiert, dann vermutlich
mit 50Hz.

Deshalb: Vergesse alles was mit VBlank zu tun hat, und
nutze das timer.device zum warten. Dann kannst du die
Framerate auch viel besser beeinflussen und bist nicht an
50Hz gebunden.
Auf Grakas kann man den Rasterstrahl nicht abfragen und
ausnutzen. Du kannst also nur einfach drauf los blitten
und hoffen dass es gut aussieht. Und meistens tuts das auch,
siehe Asteroids.


--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, UDM, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de



[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Doublebuffering oldfashioned... [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.