ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Programmierung > Swappen von Bitmaps | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- 2 | [ - Beitrag schreiben - ] |
15.02.2007, 20:03 Uhr Der_Wanderer Posts: 1229 Nutzer |
Hallo ! Kann man Picasso oder CGX irgendwie daran hindern, eine Bitmap zwischen Graka RAM und normalem RAM zu swappen ? -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
17.02.2007, 14:36 Uhr uho Posts: 114 Nutzer |
Hallo, im Prefs-Einsteller "CybergraphX" gibt es dafür die Schalter "NoPassThrough" und "KeepAmigaVideo". Außerdem kann man im Early-Startup-Menü der CyberVisionPPC die Darstellung der GraKa abschalten, was die AGA-Geschwindigkeit deutlich erhöht. Hab aber gerade die Tastenkombination dafür nicht zur Hand. Gruß uho [ - Antworten - Zitieren - Direktlink - ] |
17.02.2007, 16:04 Uhr malte2 Posts: 148 Nutzer |
@ uho Thema verfehlt, sechs, setzen! ;-) @ thilo nein, das geht nicht. [ - Antworten - Zitieren - Direktlink - ] |
18.02.2007, 19:35 Uhr Der_Wanderer Posts: 1229 Nutzer |
Schade. Habe ich mir aber schon fast gedacht. Sowas wie ein NoSwap Flag wäre toll. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
18.02.2007, 22:02 Uhr thomas Posts: 7718 Nutzer |
Warum glaubst du, daß deine Bitmaps geswappt werden ? Und warum meinst du, daß das von Nachteil wäre ? Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
19.02.2007, 11:10 Uhr Der_Wanderer Posts: 1229 Nutzer |
Ich habe eine Game Engine geschrieben, mit Double Buffering, d.h. ich male auf einer unsichtbaren Bitmap herum und swappe sie dann auf den sichtbaren Screen, entweder durch BltBitmapRastport() oder durch ChangeVPBitmap(). Das Problem hierbei ist, dass sie Speed natürlich enorm einbricht wenn die Hintergrund Bitmap ins FastRam geswapped wird. Es wäre besser, wenn z.B. Objekte, die beblittet werden, nicht ins Graka RAM geschoben werden und dafür die Hintergrund Bitmap bleibt. Das Grafiksystem kann ja nicht wissen, was ich vorhabe, und kann das nicht optimieren, so wie ich es könnte. Ein Trick ist, einen 2x so hohen Screen anzulegen wie der sichtbare Bereich ist. Dadurch zwingt man die untere Hälfte, auf der man malt, im Graka RAM zu liegen. Ok, es ist keine Garantie, aber zumindest auf WinUAE mit Picasso funktioniert das. Aber das ist natürlich hacky, und geht auch z.B. im Window-Modus nicht, sondern nur Full Screen. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
19.02.2007, 15:53 Uhr whose Posts: 2156 Nutzer |
@Der_Wanderer: Hast Du mal über LockBitMap() nachgedacht? Also, die Riesen-Hintergrund-Bitmap locken, wenn Du die kleineren Bitmaps der Objekte blittest und nach dem Blit der Objekte die Hintergrund-Bitmap wieder unlocken? Ok, Du wirst es nicht verhindern können, daß die Hintergrund-Bitmap in Extremfällen doch wieder im FastRAM landet (und, noch schlimmer, daß Du sie dann dort festhältst), aber im Allgemeinen sollte die Hintergrund-Bitmap bei der Methode im Video-RAM bleiben. Blöderweise ist über den Swap-Mechanismus der RTG-Systeme wenig dokumentiert (obwohl das eigentlich in manchen Belangen nötig wäre)... Edit: Blöde Idee, sehe ich gerade. Man kann zwar graphics.library-Funktionen benutzen, es wird aber nicht gerade empfohlen... Vertrackte Kiste! Eventuell wäre Holgers Idee, sich über das verfügbare Video-RAM zu informieren, doch ein Weg? Hat CGFX eine Möglichkeit, über die man an das noch freie Video-RAM kommt? Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
19.02.2007, 16:09 Uhr malte2 Posts: 148 Nutzer |
Innerhalb eines (Un)lock Paares darf man keine Grafikbefehle ausführen. [ - Antworten - Zitieren - Direktlink - ] |
19.02.2007, 16:15 Uhr whose Posts: 2156 Nutzer |
@malte2: In den P96-Autodocs steht es etwas anders. Laut diesen kann man Funktionen der graphics.library nutzen, es wird jedoch davon abgeraten, da einige graphics.library-Funktionen die betroffene Bitmap selbst locken. Zitat: Naja, gehopst wie gesprungen... eine wirkliche Lösung ist das ja somit nicht. Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
19.02.2007, 16:33 Uhr Der_Wanderer Posts: 1229 Nutzer |
Die einzige Lösung ist dann wohl ein größeren Hammer nehmen (sprich, mehr Graka RAM als Mindestvorraussetzung). -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
19.02.2007, 18:19 Uhr Holger Posts: 8116 Nutzer |
Zitat: Das wäre ja genau das Gegenteil von dem, was er will. Eine BitMap locken heißt, sie ins FastRAM zu verlagern. Damit man sie mit der CPU bemalen kann. Deshalb sind ja graphics.library-Funktionen in diesem Zustand nicht empfehlenswert. Diese müssten a) mit der CPU oder b) mit je einem FastRAM->GfxRAM und GfxRAM->FastRAM Transfer verbunden ausgeführt werden. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
20.02.2007, 01:47 Uhr whose Posts: 2156 Nutzer |
Zitat: Hmm... kann sein, daß ich die P96- wie auch die CGFX-Autodocs da falsch interpretiere, das will ich nicht ausschließen. Ich habe daraus bisher immer nur gelesen, daß (p96)LockBitMap() verhindert, daß die Bitmap während eines Direktzugriffes möglicherweise ausgelagert wird, eben um einen direkten Zugriff überhaupt erst zu ermöglichen. Man kann ja auch eine sich bereits im Display befindliche Bitmap locken. Wird die dann wirklich ins Fast RAM ausgelagert für die Dauer des Locks? Irgendwie kann ich mir das nicht vorstellen. @Der_Wanderer: Einen Notnagel könnte ich mir zumindest in der Theorie vorstellen (ich gebe aber keine Garantie für die Anwendbarkeit in der Praxis, ich ahbe das noch nie ausprobiert): Unterteile die Riesen-Hintergrund-Bitmap in mehrere Teile, 4 z.B. Der Mehrverbrauch an Zeit für die 3 zusätzlichen Blits zzgl. der evt. vorkommenden Swaps für eins oder zwei der Teile könnte dann evtl. unter dem Zeitaufwand für den Riesen-Swap liegen, Zorro z.B. ist ja kein Geschwindigkeitswunder. Ich gehe mal davon aus, daß die Hintergrund-Bitmap eine Offscreen-Bitmap ist, richtig? Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ Dieser Beitrag wurde von whose am 20.02.2007 um 02:05 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
20.02.2007, 11:02 Uhr Der_Wanderer Posts: 1229 Nutzer |
Also die Riesenhintergrundbitmap ist so gross wie der Screen, z.B. 640x480. Sie zu unterteilen ist eine gute Idee, nur dann bekomme ich Probleme nahtlos darauf herumzumalen, bzw. ich müsste immer mit verschiedenen offsets auf alle 4 Bitmaps blitten/malen (mit ClipRegion). Das mit dem Lock: Während man einen Lock hält, wird die Bitmap natürlich nicht verschoben, damit man darin herum malen kann. Aber es kann natürlich sein, dass sie ins Fastram geschoben wird wenn man den Lock anfordert. Ausserdem muss man den Lock schnellst möglich wieder frei geben, um das Grafiksystem nicht zu blockieren. Ich denke das ist keine gute Lösung, um das Swappen zu verhindern. Manche hier haben ja geschrieben, dass gerade ein Lock dafür sorgt, dass die Bitmap ins RAM geholt wird. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
20.02.2007, 14:51 Uhr whose Posts: 2156 Nutzer |
Zitat: Ja, das ist dann natürlich nicht ganz einfach und für manche Grafikaufbauten sicher auch enorm unpraktisch. Wenn Du allerdings feste Positionen in Deinem Aufbau der Grafik ausmachen kannst, böten die sich für eine Unterteilung an. Wie gesagt, alles recht theoretisch und, so oder so, nur eine Notlösung. Zitat: Wie ich schon schrieb, ich kann mir genau das beim besten Willen nicht vorstellen. Man kann ja, wie schon erwähnt, auch eine im sichtbaren Bild befindliche Bitmap locken und darin herummalen, wie wird die denn dann dargestellt, wenn sie sich doch ab dem LockBitMap() im Fast RAM befindet? Der Videochip bzw. die D/A-Konverter können doch dann gar nicht direkt darauf zugreifen und es gäbe ein Riesen-Hin- und Hergeschiebe. Für so beschränkt halte ich die RTG-Entwickler nun wahrlich nicht. Umgekehrt ist der direkte Zugriff aufs Video-RAM via Zorro für die CPU kein großes Problem, wenn man mal von der arg reduzierten Geschwindigkeit absieht. Die Karten blenden sich mit ihrem Speicher ja meist komplett in den Zorro-Adressraum ein, anders könnten die sichtbaren Bilddaten ja auch gar nicht ins Video-RAM kommen, wenn man mal von "Speicherfenstern" wie z.B. bei den XT/AT-Emulatorkarten (und die PicassoII bot, glaube ich, auch einen 64K-Paging-Modus an, oder irre ich mich da?) absieht und enormer Zeitaufwand beim Übertragen der Daten vermieden werden soll. Abgesehen davon steht z.B. im P96-Autodoc kein Wort davon, daß die Bitmap beim Lock ins Fast RAM ausgelagert wird, sondern nur, daß eine Aus- bzw. Verlagerung durch den Lock verhindert wird und man sich sputen soll, da ab dem Lock ein Screen-Switching und andere Bitmap-relevante Funktionen, die eine Auslagerung auslösen könnten, bis zum UnlockBitMap() nicht mehr möglich sind. Das könnte ich mir u.A. auch als Grund für die Nicht-Empfehlung der Benutzung der Funktionen der graphics.library vorstellen. Klingt auch logisch, wenn man bedenkt, daß bei einem Screen-Switch die gerade noch sichtbare Bitmap möglicherweise aus Speichermangel auf der Karte ins Fast RAM ausgelagert werden muß, um die des nun ganz vorn liegenden Screens sichtbar machen zu können. Ohne die garantierte Nicht-Auslagerung durch den Lock würde das RTG-System der CPU die Beine unterm Hintern wegziehen, wenn ein Direktzugriff auf die erstere Bitmap ausgeführt wird, während genau diese Bitmap gerade vom RTG-System ins Fast RAM ausgelagert wird, weil Platz für die neu sichtbare Bitmap geschaffen werden muß. Die CPU würde dann die gerade neu sichtbar gewordene Bitmap beschreiben, aber nicht die, die sie ursprünglich beschreiben sollte. Was ich aber in der Tat hinderlich für die Lock-Lösung finde, ist das ausdrückliche Abraten von der Benutzung der Funktionen der graphics.library, obwohl es nicht verboten wurde. Und natürlich, wie Du schon sagtest, daß man ein Auslagern einer bestimmten Bitmap ins Fast RAM nicht ausdrücklich verhindern kann. Vermutlich hast Du Recht und es geht nur mit der "Holzhammer-Methode" einigermaßen flott, sprich: Höhere Voraussetzungen für die Grafikkarte. Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ Dieser Beitrag wurde von whose am 20.02.2007 um 14:57 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
20.02.2007, 15:40 Uhr Holger Posts: 8116 Nutzer |
Zitat:Garantiert nicht, aber Du unterliegst einem Denkfehler: Zitat:Die arg reduzierte Geschwindigkeit ist ein Problem, denn wozu ist die LockBitMap-Funktion denn da? Primär, um der CPU den Zugriff darauf zu ermöglichen, z.B. für spezielle Blending-Operationen. Also, normalerweise verdammt viele Zugriffe auf die Pixeldaten auf einen Haufen. Eben damit keiner auf die dumme Idee kommt, das über zigtausend ReadRGBPixel() und WriteRGBPixel() durchzuführen, gibt es diese Möglichkeit. Und ob der Direktzugriff überhaupt möglich wäre, sprich der Gfx-Speicher tatsächlich im ZIII-Adressraum eingeblendet ist, ist gar nicht spezifiziert. Vielleicht wollen zukünftige Systeme ja wenigstens ein bisschen Speicherschutz implementieren. Der gleichzeitige Zugriff von Grafikkarten und CPU ist dabei ziemlich problemlos. Das Verlagern in's FastRAM heißt ja nicht, dass die Kopie im Videospeicher sich auflöst. Sie existiert die ganze Zeit weiter und kann auf dem Monitor dargestellt werden. Spätestens, wenn die BitMap wieder freigegeben wird, müssen die aktualisierten Daten wieder aus dem FastRAM in's VideoRAM übertragen werden, was natürlich wesentlich effizienter vonstatten geht, als pixelweise CPU-Zugriffe. Dabei bleibt alles konsistent, weil ja die lockende Anwendung als einziges auf die BitMap schreiben darf. Deshalb muss sie ja auch so schnell wie möglich damit fertig werden und sie wieder freigeben. Natürlich sagt jetzt keine Spezifikation, wie es wirklich passiert, weil das ja systemabhängig unterschiedlich sein könnte, und was auf System a effizient ist, muss es ja auf System B nicht zwangsläufig auch sein. Aber dass man diese Möglichkeit am Besten gar nicht erst benutzt, das bleibt gleich... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
20.02.2007, 21:16 Uhr whose Posts: 2156 Nutzer |
Zitat: Hm, ich denke mal, diese Möglichkeit hat durchaus ihren Sinn, sonst wäre sie nicht bei den "öffentlichen" Funktionen aufgeführt. Über die Ratsamkeit kann man in einigen Fällen sicherlich prima streiten und ich bestreite gar nicht, daß es Grafikkarten geben mag, die ohne Transfer der Daten ins Fast RAM gar nicht klarkommen. Mir persönlich ist eine solche aber nie untergekommen. Gehört habe ich mal von einer GraKa, die Zorro-Zugriffe auch über ein 64K-"Fenster" abwickeln kann (PicassoII?), um u.A. verträglicher mit Turbokarten in Z2-Systemen zu sein. Das ändert aber nichts daran, daß ein kompletter Transfer ins Fast RAM und zurück das ineffizienteste ist, was man sich vorstellen kann. Grafikkarten für den Amiga unterstützen seltenst DMA-Zugriffe Was ich z.B. bemerkt habe ist ein ziemlich lahmer Lesezugriff über den Zorro-Bus bei verschiedenen Grafikkarten. Und ein recht fixer Schreibzugriff z.B. auf die CVisionPPC, sofern man selbst eine "Kopie" der zu bearbeitenden Bitmap im Fast RAM hält und diese dann mittels z.B. CopyMem() ins Video-RAM transferiert. So arbeiten übrigens viele der Ego-Shooter-Ports. Und die sind sogar so nett, vor dem CopyMem() die Bitmap zu locken, damit sie an die Adresse herankommen. Wo wäre der Sinn dieser Vorgehensweise (eine Extra-Bitmap im FastRAM zusammenbasteln und diese dann an die Adresse zu kopieren, die der Lock ergibt), wenn sie (die Bitmap) nach einem Lock doch eh schon im Fast RAM zu finden ist? Ich weiß ehrlich gesagt nicht, ob es klug ist, zu sagen "das ist nirgendwo spezifiziert, aber gelockte Bitmaps liegen dann im Fast RAM". Da wäre es klüger zu sagen: "Locks nützen Dir nicht viel, es sei denn, Du willst die Heidenarbeit auf Dich nehmen, alle nur denkbaren Pixelformate zu unterstützen und noch dazu statt des Blitters auf die vergleichsweise langsame CPU setzen". Und bei Der_Wanderer gehe ich davon aus, daß er ein bißchen mehr Durchblick beim Thema hat. Seine Projekte sprechen da eigentlich eine recht deutliche Sprache. Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
20.02.2007, 22:30 Uhr Holger Posts: 8116 Nutzer |
Zitat:Weil es ja nunmal keine Garantie dafür gibt, dass sie im FastRAM liegt. Darum geht's ja, Du bekommst durch das locken den Zugriff, aber keinen Garantie, welcher Speicher das nun ist. Der Sinn für die meisten Ego-Shooter liegt allerdings darin, dass der Puffer, mit dem sie rechnen, in einem für's Rechnen optimierten Pixelformat vorliegt, unabhängig davon, in welchem Pixelformat der Bildschirm dann arbeitet. Trotzdem ist natürlich ein Aufruf einer der WritePixelArray-Varianten, die exakt für diesen Zweck vom Grafikkartentreibersystem vorgesehen sind, wesentlich effizienter und systemkonformer, und stattdessen die BitMap zu locken und die Daten von Hand zu kopieren einfach nur dumm. Zitat:In welcher Hinsicht? Was willst Du damit sagen? mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
20.02.2007, 23:42 Uhr whose Posts: 2156 Nutzer |
Zitat: Hm, eigentlich warst Du es ja, der "landet im Fast RAM" quasi wie ein Gesetz propagiert hat Aber die ganze Diskussion, und welches Ergebnis die letztendlich hat, hilft beim Thema relativ wenig weiter. Ein Lock auf die Bitmap nützt ihm halt nichts, weil er mit höchster Wahrscheinlichkeit BltBitMapRastPort() o.Ä. einsetzt, von deren Verwendung generell abgeraten wird. Soweit sind wir immerhin schon mal. Zitat: So pauschal kann man das eigentlich nicht sagen. Wenn die Berechnungen einem üblichen Chunky-Format abgepaßt sind, ist der Weg über WritePixelArray & Co. in fast allen Fällen etwas bis einiges ineffizienter. Aber einfacher zu handhaben, weil man sich halt nicht weiter um das Format der Display-Bitmap kümmern muß, was ja durchaus eine Menge Sinn hat. Zitat:Zitat:In welcher Hinsicht? Was willst Du damit sagen? Das er sich für z.B. AsteroidsTR sehr eingehend mit dem Thema "Grafikkarten und deren Geschwindigkeit" auseinandergesetzt hat. Und wenn Du Dir das Ergebnis anschaust, sagst Du vielleicht, genau wie ich: "Wow!" Also, wenn er etwas zu dem Thema sagt oder fragt, lese ich schon recht aufmerksam mit. Es ist fast immer etwas dabei, was mir bei meinen Vorhaben helfen kann. So auch die Sache mit der Auslagerei der Bitmaps. Bisher habe ich die Auswirkungen davon zwar nicht direkt zu spüren bekommen, aber Gedanken habe ich mir darüber schon gemacht. Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
21.02.2007, 11:33 Uhr Holger Posts: 8116 Nutzer |
Zitat:Jeder macht mal Fehler. Aber es ging um den logischen Gegensatz: Ziel: "GPU-Zugriff sicherstellen", Funktion von LockBitMap(): "CPU-Zugriff sicherstellen". Das passt nicht zusammen. Zitat:Gewiss doch interessant, aber daraus ergibt sich ja keine Lösung. Deshalb ist mir nicht klar, warum Du an dieser Stelle darauf hinweisen musstest. In meinen Augen ist es die Aufgabe des Systems, das Auslagern oder nicht Auslagern der BitMaps zu steuern. Nur, wenn P96 es wirklich so macht, wie die hier geschilderten Beobachtungen vermuten lassen, ist es Schrott. Also lautet die einzig richtige Lösung, P96 müsste gefixt werden. Gleiches gilt, wenn eine von irgend einem Anwendungsprogrammierer geschriebene manuelle Kopierroutine wirklich schneller sein sollte, als die dafür vorgesehene Transferroutine. Zumindest mit CGX+CV64 wurden Pixelformate von der Hardware konvertiert. Inwieweit tatsächlich alle Gfx-Karten auf dem Amiga nicht DMA-fähig sind, wie Du behauptest, kann ich nicht verifizieren. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
21.02.2007, 12:08 Uhr Georg Posts: 107 Nutzer |
Daß LockBitMap() auf normalen Grafikarten (A1 #? Peg #? PC #? normale Amiga Classic Grafikkarten wie Cybervision, PicassoIV) Daten vom VRAM ins RAM kopiert is 99,999999% unwahrscheinlich. Das würde überhaupt keinen Sinn machen. Z. B. weil über AGP nur ein paar Megabyte pro Sekunde Lesegeschwindigkeit möglich ist. LockBitMap() friert nur die aktuelle Position der Grafikdaten der BitMap ein. Was entweder im RAM oder im VRAM sein kein. Das Umlagern zwischen RAM und VRAM (was getan wird wenn VRAM ausgeht aber z. B. ne neue Screen BitMap sichtbar werden muß) wird zwischen LockBitMap() und UnlockBitMap() verhindert. Es mag nen 0,00000001% Ausnahmefall geben aber der Normalfall ist sicher nicht, daß LockBitMap() BitMap Daten vom VRAM ins Fastram swappt. So ein Ausnahmefall wäre z. B. unter AROS der X11/hosted Gfx Treiber, wo Screen BitMaps/Friend BitMaps von Screen BitMaps X11 Pixmaps / X11 windows sind wo kein direkter Zugriff möglich ist. Zur Zeit schlägt hier dann direkter Zugriff auf BitMap Daten per LockBitMap() einfach fehl, was laut CGFX Autodocs Apps erwarten müssen (und dann halt ne alternative Methode benützen sollten wie ReadPixelArray() ... Ändern ... WritePixelArray()). Die meisten AOS Apps ignorieren das (wie nicht anders zu erwarten) und gehen davon aus daß LockBitMap immer klappt. Theoretisch könnte der Treiber so geändert werden, daß er direkten Zugriff emuliert, also nen Buffer anlegt, die BitMap Pixel mit ReadPixelArray einliest. Die App würde dann nen Pointer of diesen Buffer bekommen, ihn Ändern, und UnLockBitMap() würde ihn dann zurückschreiben. Das ist aber sehr unoptimal, weil LockBitMap() nicht weiß welche Teile der BitMap von der App geändert werden. Es müßte also immer die ganze BitMap einlesen, was wie gesagt (AGP) sehr langsam sein kann. Bei UnLockBitMap() gibts zwar dieses UBMI_UPDATERECTS Tag was vieleicht dazu da ist der Funktion zu sagen was geändert wurde, aber das ist dann auch schon zu spät. Man müßte es zur LockBitMap() Zeit wissen. [ - Antworten - Zitieren - Direktlink - ] |
21.02.2007, 12:09 Uhr Der_Wanderer Posts: 1229 Nutzer |
> "Wow!" Danke! Ja, ich habe schon viel mit Graka rumgespielt, und es ist schon erstaunlich wie "zerbrechlich" das System ist. Ein Flag falsch gesetzt und alles ist gleich nur noch halb so schnell. Leider verhalten sich die verschiedenen Plattformen aber nicht gleich, deshalb ist es schwer eine Engine zu proggen die überall vernünftige FPS erreicht. Das Ergebnis ist in die dbl.include eingeflossen, eine 2D Game API für Amiblitz. AsteroidsTR ist quasi das Demo Spiel dafür. BlackShoot ist glaube ich auch damit gemacht, sonst hat leider noch niemand was damit programmiert. Schade, denn damit ist es ziemlich leicht ein 2D Spiel zu proggen, was selbst auf einem Classic flüssig läuft in 640x480x16 und "smooth" scrollen kann, selbst im Window Modus auf der WB. Mit SDL kommt man nie so schnell, weil alles im RAM gebastelt wird und auf die Graka geschoben wird. Bei 320x240 ist da Schluss, zumindest auf dem Classic. WritePixelArray solle aber auf jeden Fall gleich schnell oder schneller als ein CopyMem sein. Warum solle es langsamer sein ? Es ist ja genau für diese Aufgabe gemacht und nutzt u.U. vorhandene Hardware Beschleunigung aus. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ Dieser Beitrag wurde von Der_Wanderer am 21.02.2007 um 12:11 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
21.02.2007, 12:45 Uhr whose Posts: 2156 Nutzer |
Zitat: Ja, das kenne ich auch. Was auf dem WinUAE oder OS4 sehr flott läuft, kann auf dem Classic schon wieder ordentlich haken. Und umgekehrt (bizarr, aber hatte ich auch schon). Gibt halt ne Menge zu beachten und abzuwägen dabei. Aber in den meisten Fällen klappts ganz gut mit GraKa. Zitat: Naja, viele setzen AmiBlitz vermutlich nicht ein, daher dürfte das kommen. Ein Blick in Deine Includes könnte vielen C-Proggern aber den einen oder anderen Tipp geben, wie man ein halbwegs flottes Spiel für GraKa programmiert. Was kam eigentlich bei Deinen Versuchen in Sachen Doublebuffering mit ChangeVPBitMap() und ChangeScreenBuffer() heraus? Zitat: Meist ist 320 * 200 schon kaum noch zu ertragen. Zitat: Das kam durch eine mehr theoretische Betrachtung des Fast RAM-Themas. Wenn das Programm genau aufs Bitmap-Format zugeschnitten rendert, bringt WritePixelArray() keine Vorteile, weil es dann auch nur zu einem CopyMem() führt. Nachteil ist halt, daß noch ein Einsprung mehr nötig ist. Es spielt erst dann seine Stärken aus, wenn man eben nicht direkt für die betreffende Bitmap berechnet und WritePixelArray() zur Wandlung nutzt. Allgemein ist das auch der schlauere Weg, den man auf jeden Fall nutzen sollte. Der winzige Nachteil bei direkt passendem Format der Bitmap ist da absolut vernachlässigbar. Die Hardware-Unterstützung würde sich, sofern die Hardware vorhanden ist, vor allem bei c2p-Konvertierung bemerkbar machen, aber selbst dafür gibt es inzwischen Software-Lösungen, die die Geschwindigkeit des Akiko erreichen (auf der gleichen Maschine) oder manchmal sogar übertreffen. Hardware für die Wandlung von Chunky-Formaten gabs ja nie (war da nicht mal was für die CV64 vorgesehen? Roxxler hieß das Ding, glaube ich). Streng betrachtet braucht das auch kaum noch jemand, es sei denn, er programmiert direkt für ECS/AGA und rendert im Chunky-Format (Voxelspace-Klamotten fallen mir da auf Anhieb ein). Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
21.02.2007, 13:10 Uhr whose Posts: 2156 Nutzer |
Zitat: Kein Problem. Zitat: Doch, wenn man die Technik darunter nicht vernachlässigt. Im Fall von Grafikkarten und deren allgemein durchgesetztem Aufbau ist es eben nicht wurscht, ob die CPU über den Bus relativ langsam auf Teile der Bitmap im VRAM zugreift oder zuvor genauso relativ langsam aus dem VRAM diese Bitmap komplett ins Fast RAM kopiert, die kleinen Änderungen durchführt und dann den ganzen Käse mit etwas weniger Aufwand wieder zurückschiebt. Direkt ändern ist da sinnvoller. Zitat:Zitat:Gewiss doch interessant, aber daraus ergibt sich ja keine Lösung. Deshalb ist mir nicht klar, warum Du an dieser Stelle darauf hinweisen musstest. Wenn er eine Lösung hätte, hätte er vermutlich nicht gefragt. Eine Notlösung habe ich angeboten. Und durch seine Frage wieder etwas mehr über das Verhalten von GraKas erfahren, was mir irgendwann sicher von Nutzen ist. Deshalb habe ich das erwähnt. Zitat: Inwiefern? Wegen dem mutmaßlichen Ringtausch (an den ich nicht so ganz glaube, weil auch das keinen Sinn ergäbe) oder weil es durch die CPU zu bearbeitende Bitmaps nicht ins Fast RAM kopiert? Zitat: Bedenke, diese Routinen nutzen oft genug bestimmte Voraussetzungen, die nicht überall gegeben sein müssen. Die WritePixelArray()-Implementation ist schon recht flott. Bei den RGB-Varianten kann man sicher darüber streiten (wurde meines Wissens auch oft getan), aber gar so grottig sind auch die nicht. Zitat: Gabs den Roxxler denn überhaupt? Soweit ich mich erinnern kann, war der angekündigt, kam aber nie. Eine blanke CV64 kann das meines Wissens nach nicht. Ansonsten bleibt nur noch Akiko im CD32. Zitat: Mögliche Kandidaten sind nur reine Zorro3-Karten, alle anderen würden auf den meisten Zorro-Busboards ihren Dienst versagen. Von den beiden reinen Z3-Karten, die es gibt (CV64 und RetinaBLT Z3) weiß ich, daß sie dazu nicht fähig sind. Die C/BVisionPPC muß man dabei außen vor lassen, da ist es schwer von außen feststellbar, ob die DMA-Fähigkeiten betreffs des Mini-PCI-Busses auf der CS/Blizzard-PPC haben. Ich denke aber, daß das nicht der Fall ist. Ist DMA denn bei PC-Grafikkarten üblich? @Der_Wanderer: Bevor ichs vergesse: Hast Du einmal darüber nachgedacht, "unwichtige" kleine Bitmaps im Fast RAM zu halten (mehrere, wenns geht), Dir einen Platz im VRAM für EINE dieser Bitmaps zu sichern (halbwegs, garantiert ist das ja nie) und die Bitmaps bei Bedarf mittels WritePixelArray() in diesen Platz im VRAM zu schieben, bevor sie geblittet werden (oder direkt an ihren Platz zu kopieren)? Je weniger kleine und kleinste Bitmaps Du im VRAM "zwischenlagerst", auch wenn sie nicht gebraucht werden, desto geringer wird die Wahrscheinlichkeit für eine Auslagerung "im Ringtausch" (wie gesagt, an den Ringtausch glaube ich nicht so ganz. Eher an ein Fragmentierungsproblem). Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
21.02.2007, 13:22 Uhr Der_Wanderer Posts: 1229 Nutzer |
Ich habe 5 DoubleBuffer Methoden implementiert: - Single Buffering - ScrollVP - ChangeVPBitmap - ChangeScreenBuffer - BltBitmapRastPort Das erste ist natürlich kein DoubleBuffering und flackert, aber der Informatiker braucht sowas halt ;-) Auf WinUAE verhält es sich so: ChangeScreenBuffer und ChangeVPBimtap sind gleich schnell (z.B. 100FPS), wobei ich ChangeScreenBuffer nie richtig hinbekommen habe, also so dass es nicht flackert. ChangeVPBitmap funktioniert tadellos. ScrollVP ist noch einen Tick schneller (110 FPS), am schnellsten mit dem Screenhack (120 FPS), also 2x so hoher Screen statt zwei Bitmaps. BltBitmapRastPort ist am langsamsten (80FPS), aber immer noch recht ordentlich, und scheint auf allen Systemen einigermassen gleich zu performen. Diese Method braucht man im Window modus. Was man genau nutzt, kann man sich als Programmierer aussuchen. Für BltBitmapRasPort gibt es noch einen "smart" modus, wo nur veränderte Bereiche geupdated werden. Das ist dann sehr schnell bei Spielen mit wenigen Objekten und ohne Scrolling. Bei vielen Objekten oder Scrolling muss man soweiso immer den ganzen Screen updaten. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
21.02.2007, 13:39 Uhr whose Posts: 2156 Nutzer |
Zitat: Nur die Harten komm' in' Garten Zitat: Flackern oder Durchlauf? Ich wollt Dir sowieso mal ein kleines Programm schicken, das mit ChangeScreenBuffer() arbeitet und auf dem WinUAE sowie OS4 recht ordentlich aussieht. Ich hoffe, ich denke heut Nachmittag dran. Zitat: Das ist normal ScrollVP() auf eine zweite, unabhängige Bitmap anzuwenden macht auch nicht besonders viel Sinn. Technisch ist es nichts anderes als ChangeVPBitMap(). Zitat: Jup, damit arbeite ich auch. Im Fenster recht schnell, egal, in welcher Farbtiefe. Nur mit maskiertem Blit muß man höllisch aufpassen, habe ich gemerkt. Da sind Offscreen-Bitmaps in Objektgröße immer von Vorteil, aus denen heraus man nach dem Mask-Blit ins sichtbare Bild blittet. Da dürften sich wohl evtl. auftretende Offsets (also abseits von jeweils vollen 16 Pixeln) unangenehm bemerkbar machen... Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
21.02.2007, 22:30 Uhr Holger Posts: 8116 Nutzer |
Zitat:Du lässt dabei außer acht, dass die primäre Funktion von LockBitMap() dem Lesen UND Schreiben von Pixeldaten dient, um beliebige Verknüpfungen zu implementieren, denn für das simple Kopieren von Daten in die BitMap gibt es ja bereits eine dafür vorgesehene Funktion WritePixelArray, die das besser kann als jeder Anwendungsprogrammierer. Hat man erst mal eine Kopie einer BitMap im FastRAM, das geht sogar komplett ohne Lesen, wenn sie urpsrünglich da erstellt wurde, würden auch spätere LockBitMap-Zugriffe bei dieser Vorgehensweise schneller gehen, weil man ja gar nicht aus der Grafikkarte lesen muss, wenn man schon weiß, das die BitMap im VideoRAM eben den Inhalt besitzt, den man beim letzten Mal aus dem FastRAM dorthin transferiert hat. Nur ein ständiges Mischen von CPU- und Grafikchip-Operationen auf dieselbe BitMap würde die Performance einbrechen lassen. Aber das würde es auch bei jeder anderen Implementierung des BitMap-Lockings machen. Zitat: Hauptsächlich wegen des mutmaßlichen Ringtauschs. Zitat:Programme, die meinen ihre eigene WritePixelArray()-Variante via LockBitMap zu implementieren, sind Schrott. Egal, ob sie nun langsamer sind oder nicht auf allen Systemen richtig funktionieren, oder beides. Zitat:Falls Du von einer Akiko-Variante sprichst, das interessiert mich nicht die Bohne und dürfte für die hier besprochene Thematik, also grafikkartentaugliche Programme auf einem System mit Grafikkarte, nicht relevant sein. Ich weiß aber, dass meine CV64 so Späße, wie 24Bit-BitMap auf 8BitCLUT-Screen blitten ohne Probleme durchgeführt hat. Deshalb konnte man mit CGX auf dieser Karte auch Screens ziehen. Die unteren Screens wurden halt in Echtzeit auf den Screenmodus des obersten Screens konvertiert. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
22.02.2007, 02:46 Uhr whose Posts: 2156 Nutzer |
@Holger: Im Moment streiten wir uns irgendwie recht sinnlos über Dinge, die beim Thema nicht weiterhelfen. Daß ein LockBitMap() Der_Wanderer nicht besonders weit bringt, haben wir doch schon längst festgestellt. Sogar ich habe das erwähnt. Zum Thema "ins Fast RAM kopieren" hat auch Georg etwas gesagt. Der Sinn von WritePixelArray() steht außer Frage, ich benutze es selbst, wenn ich mit Hilfe der CPU Bitmaps bearbeite und diese dann zur Grafikkarte übertragen muß. Einfacher und sicherer gehts kaum. Zu der CV64 kann ich recht wenig sagen, ich kenne die Karte kaum und alles, was ich dazu geschrieben habe, ist (teilweise unsichtbar) mit "meines Wissens" untertitelt. Es ist gut möglich, daß die tatsächlich eine Formatkonvertierung in Hardware durchführen konnte, eine Art Overlay vielleicht. Ich habe halt dunkel in Erinnerung, daß für diese Zwecke eigentlich der Roxxler vorgesehen war. Obs 100% stimmt, weiß ich nicht. Ich kann aber gern nochmal in den alten Zeitschriften nachschlagen, wenn ich dran denke. Absichtlichen Ringtausch der ausgelagerten Bitmaps habe ich in Zweifel gezogen. Hast Du denn dazu noch eine Idee? Ich mein, klingt das denn plausibel für Dich? Wenn ja, wie würdest Du Dir so ein Vorgehen erklären? Ich z.B. tendiere eher dazu, das mit "Fragmentierung" des VRAMs bei zu vielen, kleinen Bitmaps zu erklären, also, daß es in Wirklichkeit kein Ringtausch ist, sondern eine unglücklich Reihenfolge bei der Nutzung der Bitmaps, die P96/CGFX zum ständigen Austausch aller möglichen Bitmaps zwingt. Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ - Antworten - Zitieren - Direktlink - ] |
26.02.2007, 18:58 Uhr Der_Wanderer Posts: 1229 Nutzer |
> Flackern oder Durchlauf? Ich wollt Dir sowieso mal ein kleines > Programm schicken, das mit ChangeScreenBuffer() arbeitet und auf > dem WinUAE sowie OS4 recht ordentlich aussieht. Ich hoffe, ich > denke heut Nachmittag dran. @whose Danke. Sieht sehr smooth aus. Um es richtig beurteilen zu können musste aber was Fullscreen scrollen. Wie hast du das Timing gemacht? Macht ChangeScreenBuffer das automatisch ? Ich habe gesehen, dass du zwei Screen Buffer allocierst, und die dblinfo auch noch selbst. Laut RKM brauch tman aber nur einen Screenbuffer, oder sehe ich das falsch ? Ich schaue mir nochmal deinen Code genauer an, vielleicht bekomme ich es ja dann auch hin. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
26.02.2007, 19:43 Uhr whose Posts: 2156 Nutzer |
Zitat: Das ist auch nach wie vor vorgesehen, allerdings noch nicht implementiert (weißt ja, Zeitmangel). Abgesehen davon bin ich mir noch nicht so ganz klar, welche Technik ich für das Scrolling benutzen soll. Hast Du da Vorschläge, was für GraKas am besten zu gebrauchen ist, wenn man einen guten Kompromiß zwischen Geschwindigkeit und Speicherverbrauch anstrebt? Zitat: Sozusagen automatisch. Mein Programm wartet nur auf die dbi_SafeMessage und dbi_ChangeMessage (bzw. auf die Signale an den entsprechenden Ports). dbi_Safe bedeutet, daß der gerade nicht sichtbare Buffer zum Neuzeichnen "frei" ist, das andere, daß der sichtbar zu machende Buffer dann ins Bild gebracht werden kann. Um ein Timing für den "Switch" muß man sich dabei nicht kümmern, das erledigt ChangeScreenBuffers() für einen (so, wie es derzeit aussieht, wohl auch synchron zum Vertical Blank. Wie das RTG-technisch gelöst wurde, darfst Du mich aber nicht fragen. Es läuft aber flackerfrei unter P96 und wohl auch CGFX). Zitat: die dbi-Struktur brauchst Du auch, da dort die entsprechenden Message-Ports eingetragen werden. Ob das jetzt aber unbedingt notwendig ist, die selbst anzulegen, weiß ich aus dem Stegreif gar nicht. Ich habe den Code aus comp.sys.amiga.programmer und schon länger nicht mehr angefaßt geschweige denn auf Optimierungsmöglichkeiten hin untersucht. Ich war schon ziemlich froh, daß das überhaupt lief Zitat: Dann kannst Du mir evtl. auch bei der Frage weiterhelfen, was ich daran verändert habe, daß es auf dem 4000er mit CGFX so furchtbar flackert Ich erinnere mich aber lebhaft daran, daß ich etwas im Code verändert hatte auf dem 4000er und das es davor auch dort flackerfrei ablief. Das Prinzip müßtest Du aber übernehmen können. Ich kann Dir auch noch den Teil mit der Message-Schleife schicken, evtl. wirds dann klarer, wie das funktioniert. Grüße -- --- µA1 PPC 750GX-800 A4000 PPC 604e-233 [ Dieser Beitrag wurde von whose am 26.02.2007 um 19:45 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
27.02.2007, 17:13 Uhr Der_Wanderer Posts: 1229 Nutzer |
> Das ist auch nach wie vor vorgesehen, allerdings noch nicht > implementiert (weißt ja, Zeitmangel). Abgesehen davon bin ich mir > noch nicht so ganz klar, welche Technik ich für das Scrolling > benutzen soll. Hast Du da Vorschläge, was für GraKas am besten zu > gebrauchen ist, wenn man einen guten Kompromiß zwischen > Geschwindigkeit und Speicherverbrauch anstrebt? Also ich mache da so, dass ich noch eine dritte Bitmap in Screen Größe habe, die auch im Graka RAM liegt. Die Scrolle ich dann mit ScrollRaster(), und zeichne die frei gewordene Fläche neu. Wie das genau gezeichnet wird, hängt dann eben vom Hintergrund ab. Wenn es ein Level oder sowas ist, dann sollte man am besten eine Funktion schreiben, die einem jeden Teil des Level auf Anfrage rendern kann. Das kann bei komplexen Sachen in einem PixelArray passieren, dass dann auf die entprechende Stelle mir WritePixelArray geschoben wird, oder bei Sachen wo man mit OS Befehlen auskommt kann man auch direkt auf die Bitmap zeichnen. Da man immer nur einen kleinen Teil neu Zeichnen muss, ist das eigentlich recht flott. Ein Scrolling mit überdimensionaler Bitmap, wie es auf dem Chipset üblich war, würde ich bei Grakas nicht machen, da es keinen Vorteil bringt. Man muss so oder so die Daten kopieren, wo früher das ändern eines Pointers gereicht hat. -- Thilo Köhler, Author von: HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker Homepage: http://www.hd-rec.de [ - Antworten - Zitieren - Direktlink - ] |
-1- 2 | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Swappen von Bitmaps | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |