VSYNC

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 Aktualisierungszyklus der Anzeige. Diese Synchronisierung eliminiert Stottern und verbessert die visuelle Leistung von Grafiken.

Der 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 der HWC VSYNC-Ereignisse generiert oder nicht, indem er setVsyncEnabled . SurfaceFlinger aktiviert setVsyncEnabled , um VSYNC-Ereignisse zu generieren, damit es mit dem Aktualisierungszyklus der Anzeige synchronisiert werden kann. Wenn SurfaceFlinger mit dem Anzeigeaktualisierungszyklus synchronisiert wird, deaktiviert setVsyncEnabled , um zu verhindern, dass der HWC VSYNC-Ereignisse generiert. Wenn SurfaceFlinger einen Unterschied zwischen dem tatsächlichen VSYNC und dem zuvor eingerichteten 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 dem Zusammensetzen von Fenstern für Frame N+1 beginnt. Die App verarbeitet ausstehende Eingaben und generiert Frame N+2 .

Die Synchronisierung mit VSYNC liefert eine konsistente Latenz. Es reduziert Fehler in Apps und SurfaceFlinger und minimiert Anzeigen, die in und außer Phase zueinander driften. Dies setzt voraus, dass App- und SurfaceFlinger-Per-Frame-Zeiten nicht stark variieren. Die Latenz beträgt mindestens zwei Frames.

Um dies zu beheben, können Sie VSYNC-Offsets verwenden, um die Input-to-Display-Latenz zu reduzieren, indem Sie App- und Kompositionssignal relativ zu Hardware-VSYNC machen. Dies ist möglich, da App plus Zusammensetzung normalerweise weniger als 33 ms benötigen.

Das Ergebnis des VSYNC-Offsets sind drei Signale mit gleicher Periode und Offset-Phase:

  • HW_VSYNC_0 – Die Anzeige beginnt mit der Anzeige des nächsten Frames.
  • 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.

Mit VSYNC-Offset empfängt SurfaceFlinger den Puffer und setzt den Frame zusammen, während die App gleichzeitig die Eingabe verarbeitet und den Frame rendert.

AnzeigeSync

DispSync verwaltet ein Modell der periodischen Hardware-basierten VSYNC-Ereignisse einer Anzeige und verwendet dieses Modell, um Rückrufe bei bestimmten Phasenversätzen von 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 von Hardware-VSYNC versetzt sind.

DispSync-Fluss

Abbildung 1. DispSync-Fluss

DispSync hat die folgenden Eigenschaften:

  • Referenz — HW_VSYNC_0.
  • Ausgabe – VSYNC und SF_VSYNC.
  • Feedback – Zaunsignal-Zeitstempel von Hardware Composer zurückziehen.

VSYNC/Retire-Offset

Der Signalzeitstempel von Ruhezäunen muss mit HW VSYNC übereinstimmen, auch bei Geräten, die die Offset-Phase nicht verwenden. Andernfalls scheinen Fehler schwerwiegender zu sein, als sie sind. Smart Panels haben oft ein Delta, bei dem der Ruhezaun das Ende des direkten Speicherzugriffs (DMA) zum Anzeigespeicher ist, aber der tatsächliche Anzeigewechsel und HW VSYNC erfolgt einige Zeit später.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS wird im BoardConfig.mk -Makefile des Geräts festgelegt. Es basiert auf den Eigenschaften des Display-Controllers und des Panels. Die Zeit vom Zeitstempel des Ruhezauns 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 basierend auf Anwendungsfällen mit hoher Auslastung konservativ festgelegt, z. B. teilweise GPU-Zusammensetzung während des Fensterübergangs oder Chrome-Scrolling durch eine Webseite mit Animationen. Diese Offsets ermöglichen eine lange App-Renderzeit und eine lange GPU-Kompositionszeit.

Mehr als ein oder zwei Millisekunden Latenz sind spürbar. Integrieren Sie gründliche automatisierte Fehlertests, um die Latenz zu minimieren, ohne die Anzahl der Fehler erheblich zu erhöhen.