von Michael Krosta,

Der 4P-Technik-Check: Tearing

Uncharted sieht auf der PS3 fantastisch aus. Das Gleiche gilt für Gears of War auf der Xbox 360. Race Driver: GRID macht auf allen Plattformen inklusive PC eine tolle Figur und selbst das alte Unreal Championship oder Enclave zeigen auch heute noch, wie viel Grafik-Power in der ersten Xbox steckt. Doch trotz dieser prachtvollen Kulissen ist da etwas, das stört. Bei Kameraschwenks oder Bewegungen scheint es manchmal so, als würden Risse im Bild auftreten, die fast wie kleine Wellen über die Mattscheibe laufen. Diesen Effekt bezeichnet man als

Tearing

Doch wie kommt es dazu? Ganz kurz gesagt: Weil die Bildausgabe der Grafikkarte asynchron zur Bildwiederholfrequenz des Bildschirms verläuft. Um den Vorgang genauer zu verstehen, muss man sich zunächst darüber klar werden, wie Monitor und Grafikkarte bzw. Grafikchip miteinander umgehen. Ein fester Bestandteil von Grafikkarten bzw. GPUs ist der RAM Digital-Analog-Converter (kurz: RAMDAC), dessen Aufgabe darin besteht, den Framebuffer des Grafikchips auszulesen und in ein analoges Signal umzuwandeln. Dabei hängt die Auslesegeschwindigkeit von der Monitorfrequenz ab: Bei einer Auflösung von 1280x720 bei 85Hz bleibt pro Bild 1/85-tel Sekunde Zeit, um 720 Zeilen zu lesen, wobei pro Zeile 1280 Pixel aus dem Speicher der Grafikkarte gelesen und vom RAMDAC in ein analoges Signal umgewandelt werden. Für jede Zeile registriert ein Zähler den Zyklus des Pixeltaktes, der von der Grafikkarte ausgegeben wird. Sobald eine Zeile von links nach rechts komplett durchlaufen wurde, wird ein hSync-Impuls erzeugt und der Zähler anschließend wieder zurückgesetzt. So wird die Horizontalfrequenz gebildet.

Daneben werden auch die Zeilen gezählt und ein vSync-Impuls erzeugt, sobald das komplette Bild durchlaufen wurde. Auch hier wird der Zähler anschließend zurückgesetzt. Pro Vertikalzyklus überträgt die Grafikkarte also ein Bild, das Zeile für Zeile von oben nach unten und Pixel für Pixel von links nach rechts übertragen wird. Die digitale Datenübertragung via DVI oder HDMI verläuft ähnlich - mit dem Unterschied, dass hier statt analoger die digitalen Werte auf die RGB-Kanäle (Rot-Grün-Blau) für die jeweilige Farbintensität übertragen werden und zusätzlich auch eine Leitung für die Übertragung des Pixeltakts reserviert wird.



Bei modernen 3D-Spielen ist die Berechnung eines Bildes ("Frames") sehr aufwändig, da in jedem einzelnen Bild die Objekte (bzw. Polygone) neu aufgebaut werden müssen. Daher geht das Geschehen auch gerade dann oft in die Knie, wenn auf dem Bildschirm viel los ist und entsprechend viele Positionen von Objekten berechnet werden müssen. Der Prozessor ist überfordert, die Framerate geht in den Keller und es kommt zu Rucklern, wie man sie z.B. bei Need for Speed: Undercover oder so ziemlich jedem PC-Spiel sieht, bei dem man die Leistung der eigenen Hardware durch zu hohe Grafikeinstellungen überfordert.

Da sich das Bild praktisch ständig im Aufbau befindet, aber die Grafikkarte ununterbrochen Bilder ausgibt, wäre es reiner Zufall, wenn sich gerade ein fertig gezeichnetes Bild im Grafikspeicher befindet, während er gerade ausgelesen wird. Deshalb nutzen fast alle Spiele das so genannte Double-Buffering: Dabei verwendet man sowohl einen primären Puffer, in dem sich das aktuelle Bild befindet als auch einen Hintergrund-Puffer, in dem bereits das neue Bild gerendert wird. Ist dieses fertig gestellt, wird ein Adressentausch der beiden Puffer, ein so genannter Page Flip durchgeführt, bei dem der Hintergrund-Puffer zum primären Puffer wird und umgekehrt. Teilweise wird sogar mit zwei Hintergrund-Puffern gearbeitet, um mit Triple-Buffering einem Performance-Verlust entgegen zu wirken.

Das Dumme ist nur: Dem RAMDAC ist es völlig egal, wann der Tausch von den Puffern über die Bühne geht und so wird die laufende Bildausgabe nahtlos an der aktuellen Pixelposition im neuen Bild weitergeführt. Anders gesagt: Sollte sich der Bildaufbau des ehemaligen primären Puffers gerade in der Mitte befinden, wird nach dem Tausch ab dort das neue Bild des aktuellen primären Puffers gezeigt, das dadurch eigentlich aus zwei unterschiedlichen Frames besteht. Die Trennlinie zwischen altem und neuem Bild ist dadurch mehr oder weniger deutlich als "Riss" zu erkennen. Diesen Effekt bezeichnet man als Tearing (von engl.: (to) tear = reißen), was man auch im folgenden Video von Uncharted und den Screenshots gut beobachten kann.

Video: Traumhafte Kulissen, die aber immer wieder "zerrissen" werden: Uncharted ist ein Paradebeispiel für Tearing.


Der Schlüssel zur Lösung dieses Problems liegt in der vertikalen Synchronisation, die man vor allem in PC-Spielen meist in den Grafikoptionen aktivieren kann. Dabei wird die Bildausgabe der Grafikkarte mit der des Monitors synchronisiert, indem die Grafikkarte mit der Ausgabe des neuen Bildes so lange wartet, bis das vorherige komplett am Bildschirm dargestellt wurde. Woher die Karte weiß, wann es so weit ist, dürfte mittlerweile klar sein: Durch den vSync-Impuls, der bekannterweise erzeugt wird, sobald der vertikale Bildaufbau abgeschlossen ist. Demnach werden nur komplette Bilder übertragen und das unschöne Tearing tritt nicht weiter auf. Allerdings muss dafür die interne Bildfrequenz des Monitors synchron zur Vertikalfrequenz sein. Da einige Monitore aber nicht exakt mit 60 oder 75 Hertz arbeiten, kann es hier auch trotz aktiviertem VSync noch zu Tearing kommen. Die meisten Geräte nehmen aber mittlerweile automatisch eine Anpassung vor.

Aber warum nutzen dann nicht viel mehr Entwickler VSync und verhindern dadurch diesen unschönen Effekt? Weil es sich unter Umständen auf die Performance auswirken kann. Man stelle sich vor, man sitze vor einem 100Hz-Fernseher, aber das Spiel läuft eigentlich mit 120 Bildern pro Sekunde. Mit aktiviertem VSync gingen 20 Bilder pro Sekunde verloren, da bei einer Frequenz von 100 Hertz mit VSync maximal 100 Bilder pro Sekunde angezeigt werden können. Doch gerade in diesem Bereich lässt sich der Verlust verschmerzen. Problematischer wird es, wenn die Bildausgabe der Grafikkarte nicht mit der Frequenz des Monitors mithalten kann. Nehmen wir der Einfachheit halber an, ein Spiel läuft mit 80 Bildern pro Sekunde, während der Monitor oder Fernseher auf 100 Hertz eingestellt und VSync aktiviert ist. Da eine Sekunde 1000 Millisekunden entspricht, würde das Rendern eines einzelnen Bildes 12,5 Millisekunden in Anspruch nehmen. Mit 100 Hertz könnte der Bildschirm allerdings schon nach 10 Millisekunden ein neues Bild anzeigen und der VSync-Impuls wird erzeugt. Da das Bild zu diesem Zeitpunkt aber noch nicht vom Grafikchip fertiggestellt wurde, wird der Tausch der beiden Puffer verzögert und das Bild erstreckt sich gezwungenermaßen über zwei Zyklen. Dabei muss die Grafikkarte 7,5 Millisekunden nutzlos bis zur neuen vertikalen Synchronisation warten. Zusammen mit der Berechnungszeit von 12,5 Millisekunden ergeben sich damit 20 Millisekunden pro Bild, was bei 100Hz in 50 Bildern pro Sekunde resultiert. Es werden also de facto weniger Frames pro Sekunde angezeigt als mit der Grafikkarte möglich wären, die ja eigentlich 80 Bilder pro Sekunde darstellen könnte. Angenommen, die Grafikengine wird von einem kleinen Schwächeanfall heimgesucht, bei dem die Framerate nachlässt... Während eine Ruckeleinlage ohnehin schon nervig genug ist, könnte sie mit eingeschaltetem VSync noch heftiger ausfallen.



Ein weiteres Beispiel, das sich eher an der Konsolenwelt orientiert: Hier wird meist versucht, eine Framerate von 30 Bildern pro Sekunde zu erreichen, während Fernseher in der Regel auf eine Frequenz von 60 Hertz eingestellt werden. Demnach blieben unter VSync etwa 33,33 Millisekunden Zeit für die Bildberechnung, obwohl der Fernseher bereits nach etwa 16,66 Sekunden und damit doppelt so schnell ein neues Bild darstellen könnte. Bleibt die Bildausgabe der Grafikkarte konstant, gibt es keine Probleme. Sinkt die Bildrate allerdings plötzlich auf 25 Bilder pro Sekunde ab, nimmt das Rendern pro Bild 40 Millisekunden in Anspruch. Der nächste VSync-Impuls erfolgt dagegen erst zehn Millisekunden später, so dass insgesamt 50 Millisekunden für ein einzelnes Bild draufgehen. Während der Framerate-Einbruch ohne VSync also tatsächlich "nur" von 30 auf 25 Bilder pro Sekunde stattfinden würde, ginge es mit aktiviertem VSync sogar auf nur 20 fps (Frames per Second) runter - ein Unterschied, den man spürt.

Um dem entgegen zu wirken, nutzen vor allem PC-Entwickler wie Crytek das bereits erwähnte Triple Buffering, bei dem gleich zwei Hintergrund-Puffer zum Einsatz kommen, um jederzeit fertig gerenderte Bilder für den Monitor bereit zu halten. So entsteht eine Wartezeit nur dann, wenn die Grafikengine mehr Bilder pro Sekunde generiert als der Monitor darstellen kann. Allerdings bringt dieses Verfahren auch Nachteile mit sich: Es wird nicht nur die Bildausgabe um ein weiteres Frame verzögert, sondern auch mehr Speicher benötigt. Und der ist bekanntlich immer knapp, wenn man sich mit Entwicklern unterhält. So werden die verfügbaren Ressourcen lieber für Texturen oder Anti-Aliasing verwendet, was auch die erklärt, warum Tearing vor allem bei Konsolen immer noch so häufig auftritt. Ab und zu haben aber auch Konsoleros die Wahl, ob sie VSync aktivieren wollen - so z.B. bei Saint's Row, wo die Funktion sogar extra nachträglich per Patch nachgereicht wurde. Auch Bioshock lässt dem Spieler die Wahl, ob man Slowdowns für Kulissen ohne Tearing in Kauf nehmen möchte. Ein Paradebeispiel dafür, wie man Tearing trotz vieler Berechnungen verhindern kann, ist derzeit Killzone 2. Der Wertungseinfluss ist allerdings gering: Wir lieben God of War und dessen Nachfolger, obwohl die Kulissen ständig "zerrissen" werden, bolzen trotz Tearing mit viel Freude über die Plätze von PES 2008 und helfen Faith mit Begeisterung bei ihrer Flucht über die Dächer der Stadt in Mirror's Edge, auch wenn manchmal die Zeilensprünge im Bild stören.


Kommentare

The SPARTA schrieb am
Bis jetzt hab ich am meisten Tearing bei Halo 1 erlebt, das war aber übel, der Spielspass ging aber nicht verloren. :wink:
Oberdepp schrieb am
Ein gutes Beispiel für Tearing in der aktuellen Generation ist wohl Splinter Cell Double Agent. Da müsste es eigentlich jedem auffallen (zumindest auf der Xbox 360, PS3 habe ich keine Ahnung).
mastersin schrieb am
Uranisotop 235 U hat geschrieben:
R_eQuiEm hat geschrieben:ganz ehrlich....normalerweise seh ich sowas immer, und bei Uncharted isses mir überhaupt nicht aufgefallen.
Es ist bei Uncharted auch nicht so, wie im Video gezeigt wird. Komischerweise tritt dieses Tearing in allen Videos auf, die irgendwelche Videospielvideos zeigen, egal um welches Spiel es sich handelt, ueberall ist Ruckeln und Tearing zu sehen. Das hat nichts mit dem tatsaechlichen Spiel zu tun, in Uncharted laeufst fluessig, in nahezu allen anderen Spielen ebenfalls, zumal in der Szene in Uncharted absolut garnichts los ist, warum sollte es dort auch ploetzlich so dermassen herumruckeln? Der Ersteller des Threads hat einfach keine Ahnung.
Wahrscheinlich bzw. eventuell wurde das Bild mit weniger Hz aufgenommen als es normal auf dem TV dargstellt wird. ;) Dein TV hat vielleicht mehr Herz als das Flash-Video. :x (Würde ich einfach mal freiweg um diese Uhrzeit behaupten^^)
träxx- schrieb am
R_eQuiEm hat geschrieben:ganz ehrlich....normalerweise seh ich sowas immer, und bei Uncharted isses mir überhaupt nicht aufgefallen.
Vor allem am Anfang ist es richtig schlimm :?
schattendorn schrieb am
Jack_ONeillSG1 hat geschrieben:Wenn ich ehrlich bin ist mir dieses Tearing noch nie ausgefallen...
Habs davor immer gehört Tearing hier, Tearing da, wusste aber nie was das ist.
Aber könnte es sein das viele hier sehr pinelig sind nach dem Motto: IHHHHH DIE BANANE HAT EINEN SCHWARZENFLECK DAS ESS ICH NICHT!
Man kanns auch übertreiben...

öhm, schon mal an ne brille gedacht, also in manchen spielen fällt es schon extrem auf, na ja zu verkraften ist es ja allemal
schrieb am