Meine Werkzeuge
Namensräume
Varianten

SwapChain

Aus indiedev
Wechseln zu: Navigation, Suche

Die SwapChain ist ein Konzept aus dem Umfeld der Grafikprogrammierung mit DirectX. Ähnliche Konzepte existieren jedoch auch unter OpenGL und in den meisten Grafiklibraries.

Um den Sinn und Zweck einer SwapChain genauer zu erklären, muss ein wenig ausgeholt werden.

Im Grafikspeicher einer Grafikkarte befindet sich ein Speicherbereich der das Bild enthält, dass der Monitor anzeigt. Der Monitor wird dabei üblicherweise mit einer Geschwindigkeit von ca. 60 bis 100 Bildern pro Sekunde aktualisiert, Standard sind hierbei 60Hz. Das Problem ist nun, dass eine Änderung am Grafikspeicher zum Beispiel wenn sich unsere Spielfigur bewegt, einen Schreibvorgang, also eine Änderung des Grafikspeichers bewirkt. Die Grafikkarte ist dabei normalerweise deutlich schneller als der Monitor Bilder anzeigen kann. Dadurch kann der Effekt eintreten, dass der Monitor anfängt ein Bild anzuzeigen. Damit beginnt der Monitor in der Regel in der linken, oberen Ecke. Dieser Vorgang dauert eine gewisse Zeit, je nach Monitor bis zu 16.6 Millisekunden (bei einer Bildwiederholrate von 60Hz). Wenn nun die Grafikkarte mittendrin den Bildschirminhalt ändert, so stellt der Monitor zwei unterschiedliche Bilder dar. Die eine Hälfte mit den Daten vor der Änderung und die andere Hälfte mit den Daten nach der Änderung. Diesen Effekt nennt man Tearing.

Um diesem Effekt entgegenzuwirken und effektiv zu bekämpfen wurde vor langer Zeit bereits das sogenannte Double-Buffering eingeführt. Dabei haben wir anstatt einem Speicherbereich mit Bilddaten einen weiteren, den sogenannten BackBuffer. Unser Monitor zeigt nun den FrontBuffer an, während wir die Daten im BackBuffer ändern. Aus dem FrontBuffer wird also gelesen und in den BackBuffer wird geschrieben. Sobald wir das neue Bild im BackBuffer vollständig aufgebaut haben werden die beiden Buffer umgeschaltet, der BackBuffer wird zum neuen FrontBuffer und der bisherige FrontBuffer wird zu unserem neuen BackBuffer. Dazu müssen wir nur zwei Speicheradressen vertauschen was kaum Zeit kostet und extrem schnell vonstatten geht.

Aber auch dabei kann immer noch Tearing auftreten. Es wird zwar unwahrscheinlicher, da der Zeitraum der Änderung nun deutlich kürzer ist, aber trotzdem kann es noch passieren. Um das Tearing nun vollständig abzuschaffen müssen wir das Umschalten schlicht und einfach mit dem Bildaufbau des Monitors synchronisieren. Früher, als Röhrenmonitore noch der letzte Schrei waren, wurde das Bild vom einem Rasterelektronenstrahl aufgebaut. Dieser "beschoss" jeden einzelnen Bildpunkt von links oben nach rechts unten nacheinander mit Elektronen, wodurch das Bild sichtbar wurde. Am Ende des Bildes musste die Elektronenkanone neu ausgerichtet werden und von der rechten unteren Ecke zur linken oberen "zurückwandern". Dies ist die sogenannte vertikale Austastlücke, der Vertical Retrace. Sobald dieser auftritt können wir gefahrlos den Front- gegen den BackBuffer austauschen, da wir nun einen kurzen Zeitraum haben, in dem kein neues Bild dargestellt werden konnte. Einen ähnlichen Effekt gibt es immer noch bei modernen Monitoren und deshalb können wir immer noch so arbeiten wie früher.

Unter bestimmten Umständen kann es sinnvoll sein, dass wir nicht nur mit zwei Buffern arbeiten, sondern durchaus auch mit dreien oder noch mehr. Um dies schön zu kapseln und alles anständig objektorientiert beisammen zu halten gibt es in DirectX die sogenannte SwapChain. Nähere Informationen dazu finden sich in der DirectX-Dokumentation in der MSDN oder im SDK.

Navigation
Tutorials und Artikel
Community Project
Werkzeuge