reinterpretcast

Im obigen Beispiel mag es zunächst so aussehen, als ob eine Bildwiederholrate von 0,26 Hz und eine Framerate von 0,2 FPS (Frames Per Second) nahe genug beieinander liegen, um korrekt angezeigt zu werden, aber es ist klar, wenn man sich die Demo anschaut, dass die beiden nicht synchron sind und daher regelmäßig Screen Tearing auftritt.

Das eigentliche Problem bei diesem Beispiel ist, dass es sich um eine „single-buffered application“ handelt. Wir schreiben unsere Frames direkt in den Puffer, der an das Display weitergegeben wird, und wenn das Display sein Bild aktualisieren will, besteht das Risiko, dass es ein Frame bekommt, das noch nicht ganz fertig ist. In einer realen Anwendung kann sich die Framerate oft dramatisch ändern, was dieses Problem in einfach gepufferten Anwendungen verschlimmern und das Screen Tearing noch unvorhersehbarer machen kann.

Double Buffering

Eine Möglichkeit, einige dieser Probleme zu lindern, ist die Verwendung von Double Buffering. Bei dieser Methode werden die Bilddaten in einen Back-Buffer geschrieben und erst dann in den Primary-Buffer (die Videozufuhr zum Display) kopiert, wenn ein Bild vollständig ist. Auf diese Weise sieht der Benutzer niemals halbfertige Bilder, richtig? Falsch.

Das Tearing des Bildschirms wird durch die doppelte Pufferung zwar deutlich reduziert, aber das Kopieren der Daten nimmt Zeit in Anspruch, so dass es durchaus möglich ist, dass der Monitor sein Bild nach der Hälfte des Kopiervorgangs aktualisiert! Dieses Problem kann genauso visualisiert werden wie das Tearing bei Einzelpufferung – stellen Sie sich vor, dass die Pixel, die in den primären Puffer geschrieben werden, nicht direkt von der Grafikkarte erzeugt werden, sondern nacheinander als Ergebnis eines Kopiervorgangs aus einem sekundären Puffer in den Puffer eingefügt werden.

Doppelpufferung + VSync

Eine weitere Abhilfetaktik ist die Verwendung von VSync. VSync ist die Abkürzung für „Vertikale Synchronisation“ und funktioniert so, dass der hintere Puffer erst dann in den primären Puffer schreibt, wenn sich die Anzeige aktualisiert hat. Die Hoffnung ist, dass der Pufferkopiervorgang vor der nächsten Auffrischung abgeschlossen sein sollte. Auf diese Weise wird das Tearing des Bildschirms drastisch reduziert, aber es gibt auch Probleme.

Wenn Sie eine Anwendung mit hoher Bildwiederholrate haben, funktioniert VSync normalerweise perfekt. Die Framerate ist auf die Bildwiederholrate des Monitors beschränkt, aber das ist in Ordnung, da Ihr Monitor ohnehin mit dieser Rate arbeiten würde. Das Problem tritt auf, wenn Sie eine niedrigere Framerate als die Bildwiederholfrequenz Ihres Bildschirms erreichen.

Angenommen, Sie erreichen 60 FPS auf einem Monitor mit 75 Hz – das bedeutet, dass der Bildpuffer mit 80 % der Bildwiederholfrequenz aktualisiert wird. Wenn VSync aktiviert ist, müssen die Bilder mit einer Unterteilung der Bildwiederholfrequenz in den Bildschirmpuffer kopiert werden. In diesem Fall verpasst die Anwendung die „Deadline“ bei jedem zweiten Zyklus, so dass wir am Ende die Hälfte der Bildwiederholfrequenz als Framerate haben: 37,5 FPS. Dies ist deutlich weniger als die 60 FPS, die die Grafikkarte erreichen kann.

Das TL;DR für doppelt gepuffertes VSync ist, dass, wenn Sie eine konstant höhere FPS als Ihre Bildwiederholrate erreichen, es eine gute Idee sein kann, um Screen Tearing zu reduzieren, aber wenn die FPS unter die Bildwiederholrate Ihres Bildschirms fallen, kann VSync die FPS deutlich reduzieren.

Triple Buffering + VSync

Der heilige Gral dieses ganzen Schlamassels ist normalerweise Triple Buffering mit VSync. Die Grenze von VSync mit doppelter Pufferung ist, dass die Framerate aufgrund der Wartezeit auf den richtigen Zeitpunkt zum Kopieren des sekundären Puffers in den primären Puffer deutlich sinken kann. Warten ist in der Informatik oft keine gute Idee, wenn es vermieden werden kann, daher besteht die Lösung hier darin, einfach einen weiteren Puffer hinzuzufügen.

Bei drei Puffern können die beiden hinteren Puffer abwechselnd in Anspruch genommen werden, so dass immer ein Puffer vollständig ist und einer in Bearbeitung ist. Das bedeutet, dass direkt nach einer Bildschirmaktualisierung derjenige Puffer, der gerade vollständig ist, in den primären Puffer kopiert werden kann – was die Vorteile von VSync ohne den zuvor besprochenen Nachteil der Framerate bietet.

Der Hauptnachteil der dreifachen Pufferung, wenn sie in Anwendungen verfügbar ist, ist, dass sie mehr Speicher benötigt – wenn wir über Grafikkarten sprechen, bedeutet dies mehr VRAM (Video RAM). Dies ist ein schneller Speicher, der direkt von der Grafikkarte verwendet wird. In einigen Fällen kann die dreifache Pufferung daher zu einem erheblichen FPS-Einbruch führen, während RAM mit höherer Latenz verwendet wird, um den Mangel an nativem VRAM auszugleichen. Normalerweise ist dies kein großes Problem, da die vom dritten Puffer beanspruchte Speichermenge im Vergleich zur Gesamtgröße des VRAMs oft gering ist. VSync mit nur zwei Puffern kann jedoch in einigen Nischenfällen eine bessere Framerate bieten! Hin und her, was?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.