Triple Buffering

Freitag, 12. März 2004
 / von aths
 

Der große Nachteil von VSync ist nicht das Abschneiden "oben", sondern der große Performance-Verlust, wenn man fps-mäßig zwar in der Nähe der Bildwiederholfrequenz ist, aber eben knapp darunter. Um diesen Effekt abzufangen, gibt es Triple Buffering.

Triple Buffering arbeitet mit zwei Backbuffern, nennen wir sie A und B. Das erste Bild wird in Backbuffer A gerendert. Ist es fertig, kommt das nächste Bild sofort in Backbuffer B (die Backbuffer werden also geswappt). Wenn der RAMDAC das neue Bild anfängt, nimmt er automatisch den aktuellsten Backbuffer. Das heißt, bei 90 fps und 100 Hz werden auch 90 Bilder pro Sekunde angezeigt. 10 davon (also jedes 9) sind zwei Zyklen lang sichtbar.

Mehr als 100 fps sind logischerweise nicht drin, da jedes Bild mindestens einen vollen Bildaufbau lang angezeigt wird. Die GPU muss aber nur noch dann warten, wenn sie mehr fps rendert, als der Monitor Bilder pro Sekunde aufbaut. Ansonsten kann sie in den zweiten Backbuffer rendern. Da wir davon ausgehen, dass der Monitor häufiger das Bild aufbaut, als die Engine an fps liefert, ist garantiert immer ein Backbuffer frei.

Natürlich gibt es mit Triple Buffering auch Nachteile. Einerseits wird die Bildausgabe um ein weiteres Frame verzögert. Andererseits steht weniger Speicher für Texturen zur Verfügung, da ein kompletter Backbuffer nicht gerade klein ist. Bei 1024x768 verbraucht man mit Triple Buffering immerhin 3 MB zusätzlichen Framebuffer-Speicherplatz, bei 4x Anti-Aliasing "on Scanout" (auf GeForceFX ab NV35) sind es sogar 12 MB.

Dieser Unterschied erklärt sich im übrigen folgermaßen: "Normalerweise" wird sofort downgefiltert. Dazu werden bei 4x Anti-Aliasing die vier Farbwerte gelesen und die Mischfarbe als Pixel wird wieder geschrieben. Beim "Downfilter on Scanout" liest die RAMDAC-Logik die vier Farbwerte und mischt sozusagen on-the-fly das finale Pixel zusammen. Man spart sich dabei den Schreibzugriff des fertig gefilterten Pixels in den Framebuffer.

Falls die Framerate deutlich unter die Bildwiederholrate des Monitors sinkt, ist der Gesamt-Speicherbandbreitenverbrauch natürlich größer, da der RAMDAC für jedes angezeigte Bild dann immer vier Subpixel lesen muss, statt einem Pixel. Übrigens wurde die "on Scanout"-Filtertechnik für 2x FSAA mit Voodoo4 und 5 eingeführt, und fand dann in die GeForce4 Ti Einzug. Ab GeForceFX 5900 wie gesagt wird auch 4x AA on-the-fly gefiltert.

Nicht immer führt Triple Buffering auch wirklich dazu, die großen Performance-Sprünge umgehen zu können. Zum Beispiel hat diese Option keinen Effekt, wenn zwei Bildschirme aktiv sind.

Ansonsten jedoch ist der Effekt von "Enable Triple Buffering" (beispielsweise im aTuner aktivierbar) in Quake III einwandfrei nachzuweisen. Hierzu muss in der Konsole /r_swapinterval 1 gesetzt werden, und im Treiber (oder aTuner) VSync auf "Standardeinstellung ein" (bzw. "default on"). In Max Payne bzw. Max Payne 2 kann man Triple Buffering im Optionen-Menü anfordern, VSync muss dabei im Treiber aktiviert werden:

Triple Buffering
Triple Buffering: Ein Klick, der sich lohnt.