Das VSYNC-Signal synchronisiert die Anzeigepipeline. Die Display-Pipeline besteht aus App-Rendering, SurfaceFlinger-Komposition und dem Hardware Composer (HWC), der Bilder auf dem Display präsentiert. VSYNC synchronisiert die Zeit, zu der Apps aufwachen, um mit dem Rendern zu beginnen, die Zeit, zu der SurfaceFlinger aufwacht, um den Bildschirm zusammenzusetzen, und den Anzeigeaktualisierungszyklus. Diese Synchronisierung eliminiert Ruckler und verbessert die visuelle Leistung von Grafiken.
Das HWC generiert VSYNC-Ereignisse und sendet die Ereignisse über den Rückruf an SurfaceFlinger:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger steuert, ob das HWC VSYNC-Ereignisse generiert, indem es setVsyncEnabled
aufruft. SurfaceFlinger ermöglicht es setVsyncEnabled
VSYNC-Ereignisse zu generieren, damit es mit dem Aktualisierungszyklus der Anzeige synchronisiert werden kann. Wenn SurfaceFlinger mit dem Anzeigeaktualisierungszyklus synchronisiert ist, deaktiviert SurfaceFlinger setVsyncEnabled
um zu verhindern, dass der HWC VSYNC-Ereignisse generiert. Wenn SurfaceFlinger einen Unterschied zwischen dem tatsächlichen VSYNC und dem zuvor festgelegten VSYNC erkennt, aktiviert SurfaceFlinger die VSYNC-Ereignisgenerierung erneut.
VSYNC-Offset
Die Synchronisierungs-App und SurfaceFlinger rendern Schleifen zum Hardware-VSYNC. Bei einem VSYNC-Ereignis beginnt die Anzeige mit der Anzeige von Frame N , während SurfaceFlinger mit der Zusammenstellung von Fenstern für Frame N+1 beginnt. Die App verarbeitet ausstehende Eingaben und generiert Frame N+2 .
Die Synchronisierung mit VSYNC sorgt für eine konsistente Latenz. Es reduziert Fehler in Apps und SurfaceFlinger und minimiert die Phasenverschiebung von Anzeigen zueinander. Dies setzt voraus, dass die App- und SurfaceFlinger-Zeiten pro Frame nicht stark variieren. Die Latenz beträgt mindestens zwei Frames.
Um dies zu beheben, können Sie VSYNC-Offsets verwenden, um die Eingabe-zu-Anzeige-Latenz zu reduzieren, indem Sie das App- und Kompositionssignal relativ zum Hardware-VSYNC machen. Dies ist möglich, da App plus Komposition normalerweise weniger als 33 ms dauert.
Das Ergebnis des VSYNC-Offsets sind drei Signale mit derselben Periode und Offset-Phase:
-
HW_VSYNC_0
– Die Anzeige beginnt mit der Anzeige des nächsten Frames. -
VSYNC
– App liest Eingaben und generiert den nächsten Frame. -
SF_VSYNC
– SurfaceFlinger beginnt mit der Komposition für den nächsten Frame.
Mit dem VSYNC-Offset empfängt SurfaceFlinger den Puffer und setzt den Frame zusammen, während die App gleichzeitig die Eingabe verarbeitet und den Frame rendert.
DispSync
DispSync verwaltet ein Modell der periodischen hardwarebasierten VSYNC-Ereignisse einer Anzeige und verwendet dieses Modell, um Rückrufe bei bestimmten Phasenversätzen zu den Hardware-VSYNC-Ereignissen auszuführen.
DispSync ist eine Software-Phasenregelschleife (PLL), die die von Choreographer und SurfaceFlinger verwendeten VSYNC- und SF_VSYNC-Signale generiert, auch wenn sie nicht vom Hardware-VSYNC versetzt sind.
![DispSync-Fluss](https://source.android.com/static/docs/core/graphics/images/dispsync.png?authuser=6&hl=de)
Abbildung 1. DispSync-Ablauf
DispSync hat die folgenden Eigenschaften:
- Referenz – HW_VSYNC_0.
- Ausgabe – VSYNC und SF_VSYNC.
- Feedback – Zaunsignal-Zeitstempel aus Hardware Composer entfernen.
VSYNC/Retire-Offset
Der Signalzeitstempel von Retire-Fences muss mit HW VSYNC übereinstimmen, auch auf Geräten, die die Offset-Phase nicht verwenden. Ansonsten scheinen die Fehler schwerwiegender zu sein, als sie sind. Bei Smart Panels gibt es häufig ein Delta, bei dem der Ruhestandszaun das Ende des direkten Speicherzugriffs (DMA) auf den Anzeigespeicher darstellt, der eigentliche Anzeigewechsel und HW-VSYNC jedoch einige Zeit später erfolgt.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
wird im BoardConfig.mk
Makefile des Geräts festgelegt. Es basiert auf den Display-Controller- und Panel-Eigenschaften. Die Zeit vom Zeitstempel für den Rückzug des Zauns bis zum HW-VSYNC-Signal wird in Nanosekunden gemessen.
VSYNC- und SF_VSYNC-Offsets
VSYNC_EVENT_PHASE_OFFSET_NS
und SF_VSYNC_EVENT_PHASE_OFFSET_NS
werden konservativ eingestellt, basierend auf Anwendungsfällen mit hoher Auslastung, z. B. teilweiser GPU-Zusammensetzung während des Fensterübergangs oder Chrome-Scrollen durch eine Webseite mit Animationen. Diese Offsets ermöglichen eine lange App-Renderzeit und eine lange GPU-Kompositionszeit.
Es sind mehr als ein bis zwei Millisekunden Latenz spürbar. Um die Latenz zu minimieren, ohne die Fehleranzahl wesentlich zu erhöhen, integrieren Sie gründliche automatisierte Fehlertests.