Das VSync-Signal synchronisiert die Anzeigepipeline. Die Display-Pipeline besteht aus dem Rendern der App, der SurfaceFlinger-Zusammenstellung und dem Hardware Composer (HWC), der Bilder auf dem Display präsentiert. VSync synchronisiert die Zeit, zu der Apps aktiviert werden, um mit dem Rendern zu beginnen, die Zeit, zu der SurfaceFlinger aktiviert wird, um den Bildschirm zusammenzusetzen, und den Aktualisierungszyklus des Displays. Durch diese Synchronisierung werden Ruckler vermieden und die visuelle Leistung von Grafiken verbessert.
Das 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 das HWC VSync-Ereignisse generiert, indem setVsyncEnabled
aufgerufen wird. SurfaceFlinger ermöglicht setVsyncEnabled
, VSync-Ereignisse zu generieren, damit es mit dem Aktualisierungszyklus des Displays synchronisiert werden kann. Wenn SurfaceFlinger mit dem Aktualisierungszyklus des Displays synchronisiert wird, deaktiviert SurfaceFlinger setVsyncEnabled
, damit der HWC keine VSync-Ereignisse mehr generiert. Wenn SurfaceFlinger eine Differenz zwischen dem tatsächlichen VSync und dem VSync erkennt, das zuvor eingerichtet wurde, wird die VSync-Ereignisgenerierung durch SurfaceFlinger wieder aktiviert.
VSync-Offsets
Die Synchronisierungs-App und SurfaceFlinger rendern Schleifen zum Hardware-VSync. Bei einem VSync-Ereignis beginnt das Display mit der Anzeige von Frame N, während SurfaceFlinger mit dem Compositing 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. Dadurch werden Fehler in Apps und SurfaceFlinger reduziert und die Phasenverschiebung zwischen den 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-Offsets verwenden, um die Latenz zwischen Eingabe und Anzeige zu reduzieren. Dazu machen Sie das App- und das Compositing-Signal relativ zum Hardware-VSync. Das ist möglich, weil die Komposition von Apps in der Regel weniger als 33 ms dauert.
Das Ergebnis eines VSync-Offsets sind drei Signale mit derselben Periode und derselben Offsetphase:
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 Compositing für den nächsten Frame.
Bei VSync-Offsets 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 regelmäßigen hardwarebasierten VSync-Ereignisse eines Displays und verwendet dieses Modell, um Rückrufe in bestimmten Phasen-Offsets von den Hardware-VSync-Ereignissen auszuführen.
DispSync ist eine Software-Phasenregelschleife (Phase-Locked Loop, PLL), die die von Choreographer und SurfaceFlinger verwendeten Signale VSYNC
und SF_VSYNC
generiert, auch wenn sie nicht vom Hardware-VSync versetzt sind.
Der DispSync-Ablauf wird in der folgenden Abbildung dargestellt:

Abbildung 1: DispSync-Ablauf.
DispSync hat die folgenden Eigenschaften:
- Referenz:
HW_VSYNC_0
. - Ausgabe:
VSYNC
undSF_VSYNC
. - Feedback: Zeitstempel für Grenzsignale aus dem HWC entfernen.
VSync-Retire-Offsets
Der Signal-Zeitstempel von Retire-Fences muss mit dem HW-VSync übereinstimmen, auch auf Geräten, die die Offset-Phase nicht verwenden. Andernfalls scheinen Fehler schwerwiegender zu sein, als sie tatsächlich sind. Smartpanels haben oft ein Delta, bei dem die Retire-Grenze das Ende des direkten Speicherzugriffs (DMA) auf den Anzeigespeicher ist, der tatsächliche Display-Switch und HW-VSync jedoch einige Zeit später erfolgen.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
wird in der BoardConfig.mk
-Makefile des Geräts festgelegt. Sie basiert auf dem Displaycontroller und den Eigenschaften des Displays. Die Zeit vom Zeitstempel des Retire-Fence 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 auf der Grundlage von Anwendungsfällen mit hoher Last festgelegt, z. B. der teilweisen GPU-Zusammensetzung während des Fensterübergangs oder des Scrollens in Chrome auf einer Webseite mit Animationen. Diese Offsets ermöglichen eine lange App-Renderzeit und eine lange GPU-Kompositionszeit.
Latenzen von mehr als ein oder zwei Millisekunden sind spürbar. Um die Latenz zu minimieren, ohne die Anzahl der Fehler deutlich zu erhöhen, sollten Sie gründliche automatisierte Fehlertests einbinden.