Der Kampf mit dem Tearing
Wer kennt es nicht: Man scrollt durch eine Webseite, schaut ein Video an oder spielt ein Spiel. Und immer wenn sich etwas bewegt, gibt es hässliche Sprünge im Bild: Tearing.
In diesem Artikel werde ich kurz beschreiben, auf welche Arten ich dieses Problem bislang unter Linux bekämpft habe. Ja, es gibt viele Möglichkeiten, mit diesem Problem umzugehen und je nach Anwendungsbereich gibt es unterschiedliche Vor- und Nachteile.
Was ist Tearing?
Das Bild auf einem Bildschirm wird zeilenweise aufgebaut. Das ist nicht nur bei alten Röhrenbildschirmen so, sondern auch in der heutigen Flachbildschirmzeit. Gründe dafür gibt es viele (u.a. kann man nicht alles parallel übertragen).
Normalerweise ist das kein Problem, bewegt sich das Bild jedoch, kommt es zu einem unerwünschten Effekt, dem Tearing. Das sind "Sprünge", die dadurch entstehen, dass die obere Hälfte des angezeigten Bildes nicht mehr zur unteren Hälfte passt, da es zwischenzeitlich geändert wurde.
Ein Computerprogramm erstellt (oft auch mit Hilfe der Grafikkarte) ein Bild. Dieses muss über die Grafikkarte genau dann an den Bildschirm geschickt werden, wenn der Bildschirm aktualisiert wird (meistens 60 Mal in der Sekunde). Diese Synchronisation zwischen Bilderzeugung und -darstellung nennt man VSync (Abkürzung von vertikale Synchronisation). Funktioniert die Synchronisation nicht, wird das Bild zum falschen Zeitpunkt geändert und somit zerrissen.
VSync
Realisiert wird der VSync meist dadurch, dass der Anwendung mitgeteilt wird, wann der Bildschirm das Bild aktualisiert. Das Bild wird auf dem Computer generiert und im passenden Moment an den Bildschirm geschickt. Dazu muss die Anwendung diese Funktion aber unterstützen.
Compositor
Allerdings gibt es auch für andere Anwendungen eine Lösung: Der Compositor. Ein Compositor setzt sich zwischen die Anwendung und den Grafiktreiber (die Pipeline, die von Anwendung bis zum Bildschirm verläuft, ist recht umfangreich, darauf will ich nicht weiter eingehen) und speichert das Bild zwischen, um es im richtigen Moment weiterzuleiten. (Außerdem können viele Compositor auch Effekte wie Transparenz und Schatten hinzufügen.)
Ich verwende Compton, da es ein performanter und simpler Compositor ist, der üblicherweise sehr gut läuft und den man sehr umfangreich konfigurieren kann. Meine Config sieht zur Zeit so aus: ~/.config/compton.conf:
backend = "glx";
paint-on-overlay = true;
glx-no-stencil = true;
glx-no-rebind-pixmap = true;
glx-use-copysubbuffermesa = true;
Mit meiner ATI Grafikkarte lief es so bestens (und mit möglichst guter Performance, wenn die Inhalte der man-Page stimmen). Auf meinem ThinkPad mit Intel-Grafik kam es aber dennoch zu Tearing. Warum?
Die Suche ergab, dass glx-use-copysubbuffermesa
deprecated ist, also nicht mehr verwendet werden sollte. Intel bastelt sehr viel an seinen Treibern und schmeißt die Unterstützung von alten Funktionen gerne raus. Also habe ich meine Config entsprechend angepasst:
backend = "glx";
paint-on-overlay = true;
glx-no-stencil = true;
glx-no-rebind-pixmap = true;
glx-copy-from-front = true;
glx-swap-method = "3"
Das lief auch erst recht gut, doch nach Update auf 2.99.912 flackerte alles. Ich musste erst Compton killen, bevor ich mit dem System arbeiten konnte. Mit viel Tearing habe ich schließlich den Grund gefunden: Intel hat mal wieder Sachen rausgeschmissen, die nie so richtig offiziell waren. DRI2 unterstützt nämlich offiziell kein Tripelbuffering, dennoch gab es einige Hacks um es zu ermöglichen. Die Lösung war natürlich, glx-swap-method = "3"
zu entfernen.
Aus Neugier habe ich kurz darauf allerdings eine Funktion im Intel-Treiber gefunden: Mit TeaFree gibt es eine Art eingebauten Compositor. Dieser lässt sich über die X-Konfiguration aktivieren: /etc/X11/xorg.conf.d/20-intel.conf:
Section "Device"
Identifier "Intel Graphics"
Driver "intel"
Option "TearFree" "true"
EndSection
Das Ergebnis: Kein Tearing und weniger CPU-Belastung. Schatten und Transparenz habe ich sowieso nie gebraucht, also bin ich völlig zufrieden mit dieser Lösung. Und es ist KISS, wie passend bei Arch Linux.