Das VSYNC-Signal synchronisiert die Displaypipeline. Die Displaypipeline besteht aus dem App-Rendering, der SurfaceFlinger-Komposition und dem Hardware Composer (HWC), der Bilder auf dem Display darstellt. VSYNC synchronisiert die Zeit, zu der Apps zum Rendern aktiviert werden, die Zeit, zu der SurfaceFlinger zum Zusammensetzen des Bildschirms aktiviert wird, und den Displayaktualisierungszyklus. Durch diese Synchronisierung werden Ruckler vermieden und die visuelle Leistung der Grafik verbessert.
Die HWC generiert VSYNC-Ereignisse und sendet sie über den Callback an SurfaceFlinger:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger steuert, ob die HWC VSYNC-Ereignisse generiert, indem setVsyncEnabled
aufgerufen wird. SurfaceFlinger ermöglicht es setVsyncEnabled
, VSYNC-Ereignisse zu generieren, damit es mit dem Aktualisierungszyklus des Displays synchronisiert werden kann. Wenn SurfaceFlinger mit dem Displayaktualisierungszyklus synchronisiert ist, deaktiviert SurfaceFlinger setVsyncEnabled
, um zu verhindern, dass die HWC VSYNC-Ereignisse generiert. Wenn SurfaceFlinger einen Unterschied zwischen der tatsächlichen VSYNC und der zuvor festgelegten VSYNC erkennt, aktiviert SurfaceFlinger die VSYNC-Ereignisgenerierung wieder.
VSYNC-Offset
Die Synchronisierungs-App und SurfaceFlinger rendern Loops an die Hardware-VSYNC. Bei einem VSYNC-Ereignis wird auf dem Display Frame N angezeigt, während SurfaceFlinger mit der Komposition von Fenstern für Frame N+1 beginnt. Die App verarbeitet die ausstehende Eingabe und generiert Frame N+2.
Die Synchronisierung mit VSYNC sorgt für eine konstante Latenz. Dadurch werden Fehler in Apps und SurfaceFlinger reduziert und das Auseinanderdriften der Displays minimiert. Dabei wird davon ausgegangen, dass die Frame-Zeiten von App und SurfaceFlinger nicht stark variieren. Die Latenz beträgt mindestens zwei Frames.
Um dies zu beheben, können Sie VSYNC-Offset verwenden, um die Latenz zwischen Eingabe und Anzeige zu verringern, indem Sie das App- und Kompositionsignal relativ zur Hardware-VSYNC festlegen. Das ist möglich, da die App-Komposition in der Regel weniger als 33 ms dauert.
Das Ergebnis des VSYNC-Offset ist drei Signale mit derselben Periode und Offset-Phase:
HW_VSYNC_0
– Auf dem Display wird der nächste Frame angezeigt.VSYNC
– Die App liest die Eingabe und generiert den nächsten Frame.SF_VSYNC
– SurfaceFlinger beginnt mit dem Zusammensetzen des nächsten Frames.
Bei einem VSYNC-Offset empfängt SurfaceFlinger den Puffer und stellt 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 eines Displays und verwendet dieses Modell, um Callbacks bei bestimmten Phasenverschiebungen von den Hardware-VSYNC-Ereignissen auszuführen.
DispSync ist eine Software-Phasensperre (PLL), die die VSYNC- und SF_VSYNC-Signale generiert, die von Choreographer und SurfaceFlinger verwendet werden, auch wenn sie nicht vom Hardware-VSYNC versetzt sind.

Abbildung 1: DispSync-Ablauf
DispSync hat folgende Eigenschaften:
- Referenz: HW_VSYNC_0.
- Ausgabe: VSYNC und SF_VSYNC
- Feedback: Die Zeitstempel für Begrenzungssignale werden aus Hardware Composer entfernt.
VSYNC/retire-Offset
Der Signalzeitstempel der Retire-Grenzen muss mit der HW-VSYNC übereinstimmen, auch auf Geräten, die die Offset-Phase nicht verwenden. Andernfalls wirken Fehler gravierender, als sie sind. Smart Panels haben oft ein Delta, bei dem das Retire-Fence das Ende des direkten Speicherzugriffs (Direct Memory Access, DMA) auf den Displayspeicher ist, der tatsächliche Displaywechsel und die HW-VSYNC jedoch einige Zeit später erfolgen.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
wird im BoardConfig.mk
-Makefile des Geräts festgelegt. Sie basiert auf den Eigenschaften des Display-Controllers und des Displays. Die Zeit vom Retire-Fence-Zeitstempel bis zum HW-VSYNC-Signal wird in Nanosekunden gemessen.
VSYNC- und SF_VSYNC-Offset
VSYNC_EVENT_PHASE_OFFSET_NS
und SF_VSYNC_EVENT_PHASE_OFFSET_NS
sind konservativ auf der Grundlage von Anwendungsfällen mit hoher Auslastung festgelegt, z. B. bei der teilweisen GPU-Darstellung während des Fensterübergangs oder beim Scrollen in Chrome durch eine Webseite mit Animationen. Diese Offsets ermöglichen eine lange App-Renderingzeit und eine lange GPU-Kompositionszeit.
Eine Latenz von mehr als ein bis zwei Millisekunden ist spürbar. Integrieren Sie gründliche automatisierte Fehlertests, um die Latenz zu minimieren, ohne die Fehleranzahl deutlich zu erhöhen.