256-Farben VGA-Programmierung in C - Double Buffering, Seite Flipping, Unchained Modus

  • der Benutzer sehen, Objekte zu halten, wird auf dem Bildschirm gezeichnet
  • zu beseitigen Flimmern.

Double Buffering ist ein ziemlich einfaches Konzept zu begreifen. Anstatt direkt in den Videospeicher zeichnen, zeichnet das Programm alles zu einem Doppelpuffer (20a). Wenn Sie fertig sind, (20b Abbildung) kopiert das Programm die Doppelpuffer in den Videospeicher auf einmal. An diesem Punkt löscht das Programm die Doppelpuffer (falls erforderlich), und der Prozess beginnt von vorne.







Abbildung 20. Double-Buffering-Konzept.

ein Doppelpuffer Die Implementierung ist auch recht einfach. Die Doppelpuffer ist im Allgemeinen die gleiche Größe wie der Bildschirm. Im Modus 0x13 würde der Doppelpuffer 64.000 Bytes sein. Wenn das Programm beginnt ordnet es Speicher für den Doppelpuffer.

Dann stattdessen Videospeicher zu schreiben, schreibt das Programm in dem Doppelpuffer.

Wenn Sie fertig sind, kopiert das Programm die Doppelpuffer in den Videospeicher (um mit der sorgfältigen Betrachtung der vertikalen Rücklauf zu beseitigen Flackern).

einen Doppelpuffer wäre schneller, wenn statt, die die Informationen aus dem Doppelpuffer zu Videospeichern (Adresse 0xA000: 0000) kopieren direkt aus dem Doppelpuffer Videodaten, die Videokarte erhalten programmiert werden könnte und nicht von der regelmäßigen Adresse (0xA000: 0000). Zwar ist dies nicht möglich, auf dem VGA ist, ist es in der Nähe, wie Seitenumblätterbetrieb funktioniert.

Mit Seitenumblätterbetrieb, muss es für zwei Bildschirme genug Videospeicher sein. Also, wenn die Bildschirmgröße 320x200 bei 256 Farben, 2 * 320 * 200 oder 128.000 Bytes Videospeicher vorhanden sein. Statt in Videospeicher oder sichtbare Seite in den sichtbaren Bereich zu ziehen. Das Programm geht zu der nicht sichtbaren Seite (Abbildung 21a). Wenn fertig, tauscht das Programm den sichtbaren Seitenzeiger mit dem nicht-sichtbaren Seitenzeiger (Abbildung 21b). Jetzt löscht das Programm die neu platzierten nicht sichtbare Seite (falls erforderlich), und der Prozess beginnt von vorne.

Abbildung 21. Page-Flipping-Konzept.

Ein Problem ist dies: im Modus 0x13, nur 64 KB Videospeicher zur Verfügung steht, auch wenn die Grafikkarte auf mehr Speicher hat. Auch wenn es eine 4 MB Grafikkarte, Modus 0x13 kann nur 64K Zugriff ist. Es gibt einen Weg, aber zwicken Modus 0x13 in einen 256-Farben-Modus, die insgesamt 256 KB Videospeicher, so dass Seitenumblätterbetrieb möglich ist. Dieser undokumentierte-Modus wird manchmal als „Mode-x“ bezeichnet, oder „Unchained-Modus.“

Die VGA-Karte verfügt über 256 KB Speicher. Viele SVGA-Karten haben viel mehr, aber auch die Karten auf, VGA-Modi kann nur die ersten 256K-außer Zugriff für Modus 0x13, die nur Zugang 64K. Der Grund dafür ist, dass Modus 0x13 ist eine Kette-4-Modus, der nur im Grunde bedeutet, jeder vierte Byte der Videospeicher verwendet wird. Der Grund dafür ist, dass die lineare Struktur des Videospeichers schnell und einfach Videospeicherzugriff erlaubt. Ausschalten Kette-4-Modus ermöglicht das Programm den Zugriff aller 256K Videospeicher, ist aber mit komplizierter Programmierung.

Im unverketteten Modus existiert Speicher in vier 64K Ebenen. Jede Ebene entspricht eine bestimmte Spalte des Videospeichers: Ebene 0 enthält Pixel 0, 4, 8, etc .; Ebene 1 enthält Pixel 1, 5, 9, usw .; 2-Ebene enthält die Spalten 2, 6, 10, etc .; und Ebene 3 enthält die Spalten 3, 7, 11, usw. (Abbildung 22). So einen Pixel an der Position zu plotten (5,7), Ebene 1 ausgewählt ist, und der Versatz (320 * 7 + 5) / 4 = 561.







Abbildung 22. Wie Videospeicher bezieht sich auf den Bildschirm.

Da unchained Modus kein Standard-VGA-Modus ist, kann es nicht einen BIOS-Funktionsaufruf eingestellt werden. Stattdessen hat bestimmte VGA-Register gezwickt werden. Es beinhaltet zwei VGA-Controller: die Sequenzsteuerung (port 0x3C4) und den CRT-Controller (port 0x3D4).

Das VGA-Register kann manchmal ziemlich komplex sein. Eine vollständige Liste der VGA-Register finden Sie auf PC-GPE Online.

ein Pixel in unchained Modus Plotten ist ein bisschen etwas mühsamer als in Modus 0x13, weil die richtige Ebene ausgewählt werden muss. Zu einer Ebene aus, schreibt 2 Ebene zu dem VGA Karte Mask-Register, in dem Flugzeug ist ein Wert von 0 bis 3 (Abbildung 23).

Abbildung 23. eine Ebene mit der Karte Maskenregister auswählen.

Die Karte Maskenregister wird bei Index 2 der Folgeregler befindet. Um die Karte Maskenregister auswählen, schreiben 2 an die Folgeregler-Adresse an Port 0x3C4. Dann kann die Karte Maske bei der Ablaufsteuerung des Datenport am Port 0x3C5 finden.

Im Modus 0x13 wird die Offset als 320Y + x berechnet. Da unchained Modusspeicher in vier Ebenen angeordnet ist, wird der Versatz in unchained Modus berechnet als (Abbildung 22).

Wenn ein anderer Wert als eine Potenz von zwei verwendet, um eine Ebene zu wählen, würde auf mehrere Ebenen ausgewählt. So wurden beispielsweise bei 13 (binär 1101) verwendet, Ebenen 0, 2 und 3 würden ausgewählt werden. Das bedeutet, dass jede Ebene ausgewählt ist, mit dem Farbwert geschrieben. Eine Verwendung für diese ist schnell Bildschirm-Clearing. Wenn jede Ebene ausgewählt ist, müssen nur 16.000 Bytes geschrieben werden, statt 64.000 wie im Modus 0x13.

Zuerst richtete zwei Wortgroße Variablen Spur der sichtbaren und nicht sichtbaren Seiten zu halten. Dies sind Offsets Videospeicher.

Dann alles tun, die Zeichnung nicht sichtbare Seite. Zum Beispiel war, wenn ein Pixel aufgetragen werden:

Wenn alle die Zeichnung fertig ist, ist es Zeit, die Seiten zu wechseln. Die neue Offset wird durch zwei Register auf der CRT-Steuerung eingestellt. Die erste, 0x0C, setzt die oberen 8 Bits des Versatzes und die zweiten, 0x0D, setzt das untere 8-Bits.

Hier sind einige Dinge zu beachten, wenn Seitenumblätterbetrieb mit:

  • Wurde das Programm Interrupts verwenden, wäre es ratsam, Interrupts zu deaktivieren, bevor Sie die Seite gekippt wurde und aktivieren sie danach. Wenn ein Interrupt zur falschen Zeit aufgetreten ist, könnte der Bildschirm vorübergehend verzerrt werden.
  • Wenn das Offset-Register geändert wird, wird das Umblättern nicht bis zum Ende des nächsten vertikalen Rücklaufs auftreten. So, nachdem die Seite gekippt wird, auf die nicht sichtbare Seite sollte das Programm bis zum Ende des vertikalen Rücklaufs wartet vor dem Zeichnen.

Im folgende Programm, statt auf den Seiten des Bezugs als sichtbare und nicht sichtbare bezeichnet sich als visuelles und aktiv. Es zieht animierte Kugeln (Abbildung 24) auf dem Bildschirm sowohl doppelte Pufferung und Seitenumblätterbetrieb verwenden, und gibt dann die Ergebnisse. Der Standardwert ist Zeichnung acht Kugeln; eine eindeutige Zahl der Kugeln kann durch Angabe einer Zahl an der Eingabeaufforderung gezogen werden. In diesem Beispiel wurden 16 Kugeln mit dem Befehl unchain 16 gezogen.

Haben Sie Probleme beim Kompilieren oder Ausführen des Programms? Siehe die Seite Fehlerbehebung.

Abbildung 25. Die Ausgabe von unchain.exe.

Obwohl in unchained Modus Seitenumblätterbetrieb in diesem Beispiel war schneller als die doppelte Pufferung im Modus 0x13, ist es nicht immer schneller. Dieses Programm erstellt wurde, um einen Punkt zu beweisen: in Abhängigkeit von der Anzahl der Pixel gezogen und die Anzahl der Ausg () ‚s oder outpw ()‘ s in unchained-Modus kann im Modus 0x13 noch schneller sein. Das Programm wurde getestet (die vertikale Retrace ignorierend) an verschiedenen Anzahlen von Objekten, die die Beziehung (Abbildung 26) zu zeigen.

Abbildung 26. Unchained Modus ist nicht immer schneller.

Einer der Gründe 0x13 Modus ist manchmal schneller als unchained Modus ist, dass für jeden Frame, wird die ausgewählte Ebene viermal für jede Kugel Objekt verändert. Das Programm könnte erstellt wurde, das Flugzeug nur vier Mal pro Rahmen auszuwählen, das die Leistung erhöht hätte, weil outp () ‚s und outpw ()‘ s sind sehr langsam Aussagen. Wenn ein Programm für unchained Modus entwerfen, die Anzahl der Ausg () ‚s und outpw ()‘ s verwendet werden, sollte möglichst so wenig eingeschränkt werden.

Dieses Programm zeigt verschiedene unchained Modi. Es unterstützt die Breite 320 und 360 und Höhen von 200, 400, 240 und 480, so gibt es insgesamt acht Kombinationen. Einstellen des gewünschten Modus ist wie so getan:

Das Programm zeigt auch planare Bitmaps, die Dinge ein wenig beschleunigt. Stellen Sie sicher, dass Sie herunterladen ghosts.bmp das Programm zum Laufen zu bringen.

Haben Sie Probleme beim Kompilieren oder Ausführen des Programms? Siehe die Seite Fehlerbehebung.