Dreifachpufferung
# Dreifachpufferung

Dreifachpufferung (englisch triple buffering) ist ein Verfahren der Computergrafik, bei dem die Grafikkarte gleichzeitig drei sequenzielle Bilder beinhalten kann. Ziel des Verfahrens ist es, bei Verwendung von vertikale Synchronisation (VSync) ein drittes Bild berechnen zu können, während ein erstes Bild noch angezeigt wird und ein zweites durch Warten auf die Bildaustastlücke noch auf seine Anzeige wartet. Doppelpufferung (double buffering) wartet hier auf die vollständige Anzeige des ersten Bildes und vergeudet damit Rechenzeit.

Der Unterschied zwischen Doppel- und Dreifachpufferung liegt in der Einteilung des Framebuffers. Während bei der Doppelpufferung der Framebuffer aus zwei Pufferspeichern (Front- und Backbuffer) besteht, sind es derer drei bei der Dreifachpufferung (ein Frontbuffer und zwei Backbuffer).

Bei interaktionslosen Anzeigen (z. B. Videowiedergabe) können wesentlich mehr Bilder vorberechnet werden, um so Engpässen vorzubeugen.

## Funktionsweise

Im Frontbuffer liegt das Bild, das gerade auf den Bildschirm gebracht wird. Im Backbuffer 1 wird das nächste Bild gerendert (berechnet). Der weitere Ablauf ist davon abhängig, wann der Swap-Befehl umgesetzt wird. Dieser wird von der GPU initiiert, wenn der nächste Frame zur Ausgabe bereitsteht und bewirkt das Vertauschen der Speicheradressen von Front- und Backbuffer (Page Flip).

* Dieser Vorgang entspricht VSync = off : Der Swap-Befehl wird direkt bei Beendigung der Berechnungen im Backbuffer 1 umgesetzt und damit Front- und Backbuffer vertauscht. Dabei kann es zum sogenannten Tearing kommen, bei dem das auf dem Monitor ausgegebene Bild aus u. U. mehreren aufeinanderfolgenden Frames besteht. Der Backbuffer 2 bleibt bei dieser Kombination ungenutzt. Dreifachpufferung ohne VSync ist somit Ressourcenverschwendung.
* Dieser Vorgang entspricht VSync = on : Die Berechnungen im Backbuffer 1 sind abgeschlossen und es wurde bereits mit dem Rendern des nächstfolgenden Bildes im Backbuffer 2 begonnen. Jetzt erfolgt die Umsetzung des Swap-Befehls. Der neue Frontbuffer (ehemals Backbuffer 1) enthält das fertig berechnete Bild und wird auf dem Monitor ausgegeben. Im neuen Backbuffer 1 (ehemals Backbuffer 2) findet die Berechnung des nächsten Frames statt. Der neue Backbuffer 2 (ehemals Frontbuffer) wurde gelöscht und steht zur weiteren Benutzung bereit.

## Doppelpufferung und VSync

Durch den Einsatz von VSync wird der Swap-Befehl, der Front- und Backbuffer tauscht, so lange nicht umgesetzt, bis das aktuelle Bild aus dem Frontbuffer komplett auf dem Bildschirm dargestellt wurde. Ist die Berechnung des neuen Frames im Backbuffer abgeschlossen, muss die GPU also bis zum nächsten VSync warten, um mit dem nächsten Frame weiterzumachen. Die effektive Rechenzeit pro Bild ist somit immer gleich der oder ein ganzes Vielfaches der Zeit, die der Monitor zum Anzeigen eines Bilds benötigt. Wenn die Bildrate der GPU also zum Beispiel knapp unter der des Monitors liegt, ist die effektive Bildrate nur die Hälfte der Monitorbildrate (da die GPU bei jedem zweiten VSync noch nicht mit dem Rendern des Bilds fertig ist). Wenn sie unter der Hälfte liegt, wird sie ein Drittel der Monitorbildrate usw.

## Dreifachpufferung und VSync

Durch einen weiteren Backbuffer kann die Bildrate des Monitors von der GPU entkoppelt werden. Wenn ein Bild fertiggestellt ist, muss die GPU nun nicht mehr warten, bis der Swap-Befehl ausgeführt wird, sondern kann direkt im anderen Backbuffer weiterarbeiten. Beim Auftreten des Swap-Befehls werden also die beiden Backbuffer vertauscht, während beim Auftreten von VSync der Frontbuffer und der (letzte) fertig berechnete Backbuffer vertauscht werden. Es kommt also zu keinem Leistungsverlust gegenüber dem ungepufferten Fall.

## Vor- und Nachteile von Dreifachpufferung und VSync

### Vorteile

* optimale Bildqualität, da kein Tearing auftritt (grafisches Artefakt, wenn während der Bildausgabe mehrere aufeinander folgende Bilder benutzt werden)
* kein Performanceverlust

### Nachteile

* geringfügig (bis zur Dauer eines Frames) steigende und stärker fluktuierende Latenz

### Bemerkung

* Bei Freesync oder G-Sync gibt es keine Dreifachpufferung mehr und diese ist auch nicht mehr notwendig. Bilder werden angezeigt, wenn sie fertig berechnet sind oder man am oberen Limit der Bildrate angekommen ist.
