Tearing wird ohne V-Sync zwangsläufig immer mehr oder weniger auftreten.
Wie auch schon bei der guten alten Röhre wird das Bild auch heute noch zeilenweise aufgebaut (
Vertikal ->
V-Sync -> klingelt's? *g*)
Das Problem ist, dass die Grafikkarte generell erstmal mit zwei Bildpuffern arbeitet. im Frontbuffer liegt das Bild, das gerade an den Monitor ausgegeben wird und im Backbuffer wird gerade das neue Bild berechnet und abgelegt. Ohne V-Sync vertauscht die Grafikkarte ohne Rücksicht auf Verluste die beiden Buffer immer sobald ein neues Bild fertig ist. Das Problem dabei ist, dass das Bild aus dem Frontbuffer möglicherweise noch gar nicht komplett an den Monitor übertragen wurde; dann kommt der Wechsel und somit auch das Tearing denn zwischenzeitlich bewegt man sich im Spiel auch...
Zum besseren Verständnis.
Sagen wir mal das wären unseren beiden Buffer und deren Inhalt mit einer gigantischen Auflösung von 5 x 5 Pixeln
Frontbuffer:
1XXXXX
2XXXXX
3XXXXX <- Aktuelle Zeilenausgabe
4XXXXX
5XXXXX
Backbuffer:
1XXXXX
2XXXXX
3XXXXX
4XXXXX
5XXXXX
Wie man unschwer erkennen kann spielen wir FarCry. Oben der Himmel, in der Mitte was sandiges samt rotem Fadenkreuz und unten etwas Vegetation. Das Bild aus dem Frontbuffer wurde schon ca. bis zur Hälfte an den Monitor übermittelt. Zwischenzeitlich haben wir aber die mit Lenkraketen ausgestattete Killermöwe am Himmel erspäht und das Fadenkreuz ruckartig nach oben gezogen, so dass sich im noch nicht sichtbaren Backpuffer passend dazu ein neues Bild aufbaut.
So, das Bild ist fertig und ohne Rücksicht auf Verluste tauscht die Grafikkarte jetzt die Bildpuffer und ihr ist es dabei sch...egal, wo sich die Bildausgabe gerade befindet. Das aktuelle Bild kommt also nie vollständig beim Monitor an und die Bildausgabe wird jetzt an gleicher Stelle im Backbuffer fortgesetzt, der jetzt durch den Tausch zum Frontbuffer geworden ist.
Das Bild, was auf dem Monitor landet sieht dann am Ende also z. B. so aus:
1XXXXX
2XXXXX
3XXXXX
4XXXXX
5XXXXX
Wir erhalten einen Mix aus zwei Bildern. An der Schnittstelle (hier links vom Fadenkreuz) überschneiden sich die beiden Bilder und passen nicht so ganz zusammen. Dieses abgehackte Stück nehmen wir dann als Tearing wahr. Das Problem tritt im Prinzip so häufig auf wie auch die Framerate hoch ist. Also durchaus auch gerne 100+ mal, was dann schon verdammt nervt.
Ein Framelimiter kann das Problem im Prinzip nur begrenzen aber nicht umgehen. Durch den Framelimiter hält man nur die Chance einer Überschneidung geringer, aber der eigentliche Grund für das Tearing liegt technisch bedingt in den beiden Bildpuffern. V-Sync wiederum zwingt die Grafikkarte dazu mit dem Buffer-Tausch zu warten bis der Monitor das Bild aus dem aktuellen Frontbuffer vollständig ausgegeben hat.
Und wenn ich schon dabei bin: fällt mit aktiviertem Vsync die Framerate unter die Frequenz des Monitors (z. B. 60 Hz bei den meisten TFTs), dann fängt es an zu ruckeln. Wo jetzt normalerweise ein Buffer-Tausch anstehen würde ist aber im Backbuffer noch kein neues Bild vollständig berechnet worden und somit muss der aktuelle Frontbuffer erneut ausgegeben werden. Das (alte) Bild landet also zwei mal auf dem Bildschirm.
Die Lösung heißt Triple-Buffer: zu dem Front- und Backpuffer kommt noch ein dritter Buffer, so dass das Problem, das kein neues Bild für die Ausgabe bereit steht, rechnerisch nicht mehr auftreten kann. Gravierender Nachteil: benötigt mehr Videospeicher und die Bildausgabe erfolgt verzögert da die Grafikkarte im Prinzip bis zu zwei Bilder zwischenspeichert, was bei 60 Hz direkt mal rund 33 ms sein können. Für einen waschechten Pro der sichere Tod