DEUTSCHE VERSION |
|
Links | | | Forums | | | Comments | | | Report news |
Chat | | | Polls | | | Newsticker | | | Archive |
amiga-news.de Forum > Programmierung > Doublebuffering oldfashioned... | [ - Search - New posts - Register - Login - ] |
-1- | [ - Post reply - ] |
2004-09-24, 17:32 h whose Posts: 2156 User |
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 [ - Answer - Quote - Direct link - ] |
2004-09-27, 21:00 h Holger Posts: 8116 User |
Zitat: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:Hoffe, das hilft weiter.WaitBOVP(&gb_screen->ViewPort); gb_screen->ViewPort.RasInfo->RyOffset = gb_screennr * gb_resy; ScrollVPort(&gb_screen->ViewPort); mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Answer - Quote - Direct link - ] |
2004-09-27, 21:07 h Holger Posts: 8116 User |
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 [ - Answer - Quote - Direct link - ] |
2004-09-28, 09:19 h whose Posts: 2156 User |
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 Danke Dir ganz gehörig! Grüße [ - Answer - Quote - Direct link - ] |
2004-09-28, 11:53 h bubblebobble Posts: 707 User |
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 [ - Answer - Quote - Direct link - ] |
2004-09-28, 12:09 h whose Posts: 2156 User |
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 [ - Answer - Quote - Direct link - ] |
2004-09-28, 13:35 h bubblebobble Posts: 707 User |
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 [ - Answer - Quote - Direct link - ] |
-1- | [ - Post reply - ] |
amiga-news.de Forum > Programmierung > Doublebuffering oldfashioned... | [ - Search - New posts - Register - Login - ] |
Masthead |
Privacy policy |
Netiquette |
Advertising |
Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved. |