Logo gameLib.de Coding
In diesem Bereich befinden sich die gesammelten Artikel zu den Themen Programmiersprache, Algorithmen und Programmiertechniken im Allgemeinen.

Page Flipping und Double Buffering

Zu jedem Spiel gehört natürlich Grafik. Heute wird in den meisten Fällen Grafik zur Laufzeit berechnet und nicht wie noch vor ein paar Jahren vorberechnete Grafiken oder Filme verwendet. 3D-Spiele erfreuen sich größter Beliebtheit, ohne Laufzeitberechnung wären diese garnicht realisierbar. Wenn Grafik auf den Bildschirm gezeichnet wird, wie es jeder Renderer macht, (das ist ein Stück Software welches die Grafik des Spiels berechnet und dann auf den Bildschirm zaubert), wird bei steigender Komplexität der Grafik auch der Berechnungsaufwand größer. Aus diesem Grund gibt es Techniken, mit welchen Grafik schnell und schön ausgegeben werden kann. Dazu gehören das so genannte Double Buffering und das Page Flipping. Dieser Artikel beschäftigt sich mit diesen beiden Techniken ohne direkt auf eine Implementierung einzugehen.

Double Buffering

Double Buffering heißt übersetzt doppelte Pufferung. Gepuffert werden im Fall dieser Technik alle Elemente die vom Programm auf den Bildschirm gezeichnet werden. Stell Dir vor Du möchtest ein Strichmännchen von einem Programm berechnen lassen und danach auf dem Bildschirm ausgeben. Zuerst müssten verschieden Punkte, welche die Ecken des Strichmännchens darstellen definiert werden. Danach werden die einzelnen Punkte mit Linien verbunden und eventuell noch gefüllt.

Würde man diesen Vorgang bei jedem Berechnungsdurchlauf wiederholen, dann sähe der Ablauf für eine Linie welche drei Punkte verbindet wie folgt aus. Interne Berechnung von Punkt 1, interne Berechnung von Punkt 2, interne Berechnung von Punkt 3, das Programm anweisen die Linie von Punkt 1 zu Punkt 2 zu zeichnen, Ausgabe, das Programm anweisen die Linie von Punkt 2 zu Punkt 3 zu zeichnen, Ausgabe, Bildschirm löschen, Wiederholung der vorherigen Schritte. Das Problem an dieser Vorgehensweise ist, dass die Ausgabe an den Bildschirm Rechenleistung benötigt. Daraus folgt, dass nach jedem gezeichneten Element dem Programm Rechenleistung abverlangt wird.

Die Lösung des Problems besteht darin, das man einen Puffer erstellt, sozusagen eine Leinwand auf der gezeichnet, welche aber nicht visuell dargestellt wird. Unser Beispiel würde dann wie folgt aussehen: Interne Berechnung der 3 Punkte, das Programm anweisen die beiden Linien in den Puffer zu zeichnen, wenn alle grafischen Elemente in den Puffer geschrieben worden sind, den Inhalt des Puffers (der ja nun ein einziges grafisches Element ist) ausgeben und wieder bei der Berechnung der Punkte anfangen. Zu dem Puffer gehört auch der Hintergrund, somit entfällt auch das Löschen des Bildschirms. Die Grafik wird einfach über die vorhergehende gezeichnet. Damit haben wir uns die Rechenleistung, welche bei der Ausgabe nach jedem grafischen Element anfällt, auf einen einzigen Schritt reduziert. Jetzt ist die Ausgabe schneller und ein angenehmer Nebeneffekt ist, daß keine Artefakte bei der Ausgabe entstehen.

Artefakte würden sich dadurch bemerkbar machen, daß bei jedem Einzelbild, wenn es hinreichend komplex ist, die einzelnen Schritte wie eine Animation ablaufen. Das führt dann dazu, daß die Animation flackert und unsauber aussieht. Das Ausschreiben der Grafikelemente aus dem Puffer auf den Grafikpuffer wird auch als "blitting" bezeichnet.
Bild


Page Flipping

Page Flipping heißt übersetzt soviel wie "Seiten austauschen". Damit sind nicht Seiten aus Papier, sondern Abschnitte im Grafikspeicher des Computers gemeint. Die meisten Grafikkarten besitzen einen Bereich in ihrem Speicher der als Video-Pointer bezeichnet wird. Das ist ein Zeiger welcher auf den Bereich der Grafikkarte schaut in welcher die Inhalte sind die auf den Bildschirm gezeichnet werden sollen. Beim Page Flipping wird wie beim Double Buffering ein Puffer, der sogenannte Back Buffer erstellt und alle Elemente auf diesen gezeichnet. Nun wird aber nicht am Ende jedes Berechnungsdurchgangs der Inhalt des Puffers auf den Grafikpuffer kopiert, sondern der Video Pointer zeigt anstatt auf den Bereich mit den Grafikelementen auf den Back Buffer und gibt genau diesen auf den Bildschirm aus. Während der Ausgabe kann das Programm dann schon wieder auf den vorher verwendeten Grafikpuffer schreiben und nachdem der Berechnungsdurchgang fertig ist, wird der Video Pointer wieder auf den alten Bereich zurückgesetzt. Von diesem Hin- und Herschalten des Video Pointers kommt auch der Begriff "flipping". Page Flipping wird vor allem bei Vollbild- anwendungen eingesetzt. Manchmal werden für das flipping auch mehr als 2 Puffer verwendet um die Geschwindigkeit noch zu steigern.
Bild


Beide Techniken, sowohl Double Buffering als auch Page Flipping, sind absolut grundlegende Verfahren, die jeder der mit Spieleprogrammierung zu tun hat zumindest mal gehört haben sollte. Zu beachten wäre noch, das der Geschwindigkeitsgewinn nicht unbedingt in Zahlen messbar ist. Aber auf jeden Fall erhöht sich der wahrgenommene Geschwindigkeitszuwachs.

Marco Hertwig - www.gamelib.de - 02.01.2006
Impressum

Valid XHTML 1.0 Transitional Valid CSS!