Wie werden 2D-Bitmaps grundsätzlich gerendert?


9

Angenommen, wir haben einen 64-Bit-Computer mit Wortadressierbarkeit und möchten ihn so programmieren, dass er ein 5x7-Zeichen ausgibt, das als Binärbild-Bitmap (wie die folgende) auf einer speicherabgebildeten Anzeige gespeichert ist.

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Da wir 5 x 7 = 35 Pixel pro Zeichen haben, können wir ein Zeichen mit 35 Bit in einem einzelnen Wort speichern. Wenn das niedrigstwertige Bit auf der linken Seite des Wortes beginnt und jedes Pixel im Bild wie oben gezeigt durch das n- te Bit dargestellt wird, wird die obige Zahl "3" im Speicher gespeichert als: 01110100010000100110000011000101110, gefolgt von 29 nicht verwendeten Bits auf 0 gesetzt.

Wurden / werden Zeichen auf diese Weise in alten / modernen Computern gespeichert? Oder verwenden sie stattdessen ein einzelnes Byte / Wort pro Pixel?

Wenn sie auf diese Weise gespeichert werden, wie würde die Routine im Assembler- / Maschinencode (die nur elementare Anweisungen wie bitweise, arithmetische und Datentransportoperationen aus der Befehlssatzarchitektur des Computers verwendet) verwendet, um diese Daten in ein Bild zu konvertieren das Display sieht aus wie? Wäre es so etwas wie:

  1. Speichern Sie die x- und y-Anzeigekoordinate für das aktuelle Pixel, das aktualisiert werden soll, in einem bestimmten Register.
  2. Speichern Sie die beiden ausgewählten RGB-Werte (in diesem Fall 0,255,0 für Grün und 0,0,0 für Schwarz) in zwei weiteren separaten Registern.
  3. Lassen Sie zwei weitere Register als auf 5 und 7 initialisierte Zähler fungieren, um die aktuelle Zeile und Spalte des gerenderten Bildes zu verfolgen.
  4. Testen Sie, ob das Spaltenregister nicht 0 ist. Wenn dies nicht der Fall ist, testen Sie, ob das LSB der Bitmap auf 1 gesetzt ist, dann UND das jeweilige RGB-Wertregister mit dem x- und y-Koordinatenregister in Abhängigkeit vom Ergebnis und dann MOV dieses Ergebnis zum Anzeigeausgangsregister.
  5. Dekrementieren Sie das Zeilenzählerregister um 1, prüfen Sie, ob es 0 ist. Wenn dies der Fall ist, setzen Sie es auf 5 zurück, erhöhen Sie die y-Koordinate um 1 und dekrementieren Sie den Spaltenzähler um 1.
  6. Verschieben Sie das Register mit der Bitmap 1 Bit nach links.
  7. JMP zu Anweisung 4.

Gibt es eine einfachere oder effizientere Möglichkeit, dies zu tun? Es scheint, als ob selbst etwas so Einfaches wie das Rendern eines einzelnen kleinen Textzeichens eine ziemlich große Anzahl von Operationen erfordert und ungefähr 200 CPU-Zyklen dauern würde.

Schließlich gibt es gute Bücher oder Ressourcen zum Code auf Maschinenebene für die Anzeige von Bildern von Grund auf neu, da ich keine finden konnte, da sie entweder dieses bestimmte Thema beschönigen oder der Code in einer höheren Sprache oder in einer höheren Sprache geschrieben ist Assembler mit Makros, die alle "schummeln" und nicht erklären, was auf der untersten Ebene grundsätzlich vor sich geht.


3
Das Graphics Programming Black Book ist sicherlich ein lesenswerter Klassiker. Viel Oldschool Black-Magic drin;)
Glampert

Ja, ich stimme dem Buch von Michael Abrash zu. Es ist eine großartige Lektüre. Es gibt viel mehr Tricks im Ärmel zu dem, was in diesem Buch geschrieben steht, aber die Philosophie dahinter ist wichtig (bis heute!)
Romain Piquois

Antworten:


7

Sie müssen den Text- und Grafikmodus der Grafikkarte Ihres Geräts unterscheiden.

Früher wurde hauptsächlich der Textmodus unterstützt. In diesem Modus hat die Karte dafür gesorgt, dass die Bitmap-Definition der Zeichen gespeichert und an der aktuellen Cursorposition angezeigt wird. Sie mussten lediglich den ASCII-Code des Zeichens (ein Byte pro Zeichen) in einem kleinen Textpuffer bereitstellen.

Heutzutage wird ein hochauflösender Rasterpuffer bereitgestellt, auf den Pixel zugreifen können und in den Sie Farbinformationen in einem unterstützten Format schreiben (im "höchsten" Modus 3 Byte (RGB) pro Pixel für ein Megapixel oder mehr).

Ursprünglich wurden einfache (gepackte) binäre Bitmaps unterschiedlicher Größe verwendet und über eine Anfrage an den Gerätetreiber mit möglicher Formatübersetzung in den Rasterspeicher " geblitzt ".

Heutzutage werden Zeichen meist als Vektorzeichnungen definiert , die eine auflösungsunabhängige Beschreibung der Umrisse darstellen und einem komplexen Rendering-Prozess unterzogen werden müssen, der Antialiasing für reibungslose Ergebnisse umfasst.

Die gerenderte Ausgabe kann für eine schnelle Anzeige zwischengespeichert werden, wiederum durch Blitting.

Der Gesamtprozess ist komplex, kann hardwarebeschleunigt werden und wird vom Betriebssystem (GUI-Management) zusammen mit anderen grafischen primitiven Zeichenvorgängen auf transparente Weise verwaltet.


1

Die kurze Antwort lautet JA. Sie können es nicht vermeiden, viel Bit zu manipulieren, wenn Ihr Format dies erfordert.

Das Zeichnen einer Bitmap bedeutet im Grunde, ein Pixel von einer Quelle zu einem Ziel zu kopieren, und Sie müssen das tun, was dazu erforderlich ist. (Zitiert Captain Obvious)

Eine längere Antwort lautet: Wenn Sie einen Software-Rasterizer schreiben, können Sie einen Algorithmus und einen Trick verwenden, um CPU-Zeit zu sparen (indem Sie wissen, welchen Teil Sie NICHT ZEICHNEN MÜSSEN (Transparenzoptimierung), indem Sie ein Pixelformat der Quelle verwenden Führen Sie als Ziel (direkt oder in Form eines Caches) eine optimale Memcopy usw. durch. Betrachten Sie grundsätzlich die Zeichenschleife Ihres Rasterizers und sehen Sie, wie Sie sie umstrukturieren können, um CPU-Zeit zu sparen. (Beispiel: Sie können zur Laufzeit a generieren Assembler-Code, nur um den Buchstaben A zu drucken oder Meta zu Ihren Quell-Bitmap-Informationen zu haben, um Ihnen zu sagen, wie Sie transparente Bereiche usw. überspringen können.) Jeder Anwendungsfall kann eine andere Lösung haben, basierend auf dem CPU-Befehlssatz, dem Pufferformat und dem Algorithmus Ihres Rendering-Grundelements (rotierend? Stretching-Bitmaps? Welche Art von Filterung? etc ...), CPU-Register und Cache etc ...

Also ja, es hat früher viel CPU-Zyklus gekostet, um einzelne Pixel zu schreiben, als seltsame Codierung und kleiner Speicher die Norm waren. :-) Aber es hat 16/32-Bit-Maschinen mit 8-MHz-CPU nicht verboten, solche Dinge zu tun: https://www.youtube.com/watch?v=GWwPJU6pp30 (Und ein großer Teil der CPU wurde auch verwendet für die Musik)

Beim HW-Rendering führt HW die Konvertierung vom Quellformat in das Zielformat durch, und obwohl es nicht viele der Tricks verwendet, die dem SW-Rasterizer zur Verfügung stehen, wird seine generische Implementierung in HW höchstwahrscheinlich den größten Teil der SW-Implementierung übertreffen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.