Il segnale VSYNC sincronizza la pipeline di visualizzazione. La pipeline di visualizzazione è costituita dal rendering delle app, dalla composizione di SurfaceFlinger e dall'Hardware Composer (HWC) che presenta le immagini sul display. VSYNC sincronizza il momento in cui le app si riattivano per avviare il rendering, il momento in cui SurfaceFlinger si riattiva per comporre lo schermo e il ciclo di aggiornamento del display. Questa sincronizzazione elimina lo stuttering e migliora le prestazioni visive della grafica.
L'HWC genera eventi VSYNC e li invia a SurfaceFlinger tramite il callback:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger controlla se l'HWC genera o meno eventi VSYNC chiamando setVsyncEnabled
. SurfaceFlinger consentesetVsyncEnabled
di generare eventi VSYNC in modo da potersi sincronizzare con il ciclo di aggiornamento del display. Quando SurfaceFlinger è sincronizzato con il ciclo di aggiornamento del display, disattiva setVsyncEnabled
per impedire all'HWC di generare eventi VSYNC. Se SurfaceFlinger rileva una differenza tra il VSYNC effettivo e quello stabilito in precedenza, riattiva la generazione di eventi VSYNC.
Offset VSYNC
L'app di sincronizzazione e SurfaceFlinger eseguono il rendering dei loop al VSYNC hardware. In un evento VSYNC, il display inizia a mostrare il frame N mentre SurfaceFlinger inizia a comporre le finestre per il frame N+1. L'app gestisce l'input in attesa e genera il frame N+2.
La sincronizzazione con VSYNC garantisce una latenza costante. Riduce gli errori nelle app e in SurfaceFlinger e riduce al minimo il fuori fase dei display tra di loro. Si presume che i tempi per frame dell'app e di SurfaceFlinger non variino molto. La latenza è di almeno due fotogrammi.
Per risolvere il problema, puoi utilizzare gli offset VSYNC per ridurre la latenza dall'input al display impostando l'indicatore dell'app e della composizione in base al VSYNC hardware. Questo è possibile perché la composizione dell'app più la composizione in genere richiede meno di 33 ms.
Il risultato dell'offset VSYNC è costituito da tre segnali con lo stesso periodo e la stessa fase di offset:
HW_VSYNC_0
: il display inizia a mostrare il frame successivo.VSYNC
: l'app legge l'input e genera il frame successivo.SF_VSYNC
: SurfaceFlinger inizia la composizione per il frame successivo.
Con l'offset VSYNC, SurfaceFlinger riceve il buffer e compone il frame mentre l'app elabora contemporaneamente l'input e esegue il rendering del frame.
DispSync
DispSync gestisce un modello degli eventi VSYNC periodici basati su hardware di un display e lo utilizza per eseguire i callback a offset di fase specifici rispetto agli eventi VSYNC hardware.
DispSync è un loop di sincronizzazione di fase (PLL) software che genera i segnali VSYNC e SF_VSYNC utilizzati da Choreographer e SurfaceFlinger, anche se non sono compensati dal VSYNC hardware.

Figura 1. Flusso DispSync
DispSync presenta le seguenti caratteristiche:
- Valore di riferimento: HW_VSYNC_0.
- Output: VSYNC e SF_VSYNC.
- Feedback: ritira i timestamp degli indicatori di recinzione da Hardware Composer.
VSYNC/retire offset
Il timestamp dell'indicatore delle recinti di ritiro deve corrispondere a VSYNC HW, anche sui dispositivi che non utilizzano la fase di offset. In caso contrario, gli errori sembrano essere più gravi di quanto non siano. I pannelli intelligenti hanno spesso un delta in cui il confine di ritiro è la fine dell'accesso diretto alla memoria (DMA) alla memoria del display, ma l'interruttore del display effettivo e VSYNC HW avviene un po' di tempo dopo.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
è impostato nel makefileBoardConfig.mk
del dispositivo. che si basa sulle caratteristiche del controller e del pannello del display. Il tempo che intercorre tra il timestamp del confine di ritiro e l'indicatore VSYNC HW viene misurato in nanosecondi.
Offset VSYNC e SF_VSYNC
VSYNC_EVENT_PHASE_OFFSET_NS
e
SF_VSYNC_EVENT_PHASE_OFFSET_NS
sono impostati in modo conservativo in base a
casi d'uso con carico elevato, come la composizione parziale della GPU durante la transizione della finestra
o lo scorrimento di Chrome in una pagina web contenente animazioni. Questi offset consentono tempi di rendering dell'app e di composizione della GPU lunghi.
È evidente una latenza superiore a uno o due millisecondi. Per ridurre al minimo la latenza senza aumentare in modo significativo il numero di errori, integra test di errori automatici approfonditi.