VSYNC

Il segnale VSYNC sincronizza la pipeline di visualizzazione. La pipeline di visualizzazione è costituita dal rendering dell'app, dalla composizione di SurfaceFlinger e dall'Hardware Composer (HWC) che presenta le immagini sul display. VSYNC sincronizza l'ora in cui le app si attivano per avviare il rendering, l'ora in cui SurfaceFlinger si attiva per comporre lo schermo e il ciclo di aggiornamento del display. Questa sincronizzazione elimina le balbuzie e migliora le prestazioni visive della grafica.

L'HWC genera eventi VSYNC e invia gli eventi 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 consente a setVsyncEnabled di generare eventi VSYNC in modo che possa sincronizzarsi con il ciclo di aggiornamento del display. Quando SurfaceFlinger è sincronizzato con il ciclo di aggiornamento del display, SurfaceFlinger disabilita setVsyncEnabled per impedire all'HWC di generare eventi VSYNC. Se SurfaceFlinger rileva una differenza tra il VSYNC effettivo e il VSYNC stabilito in precedenza, SurfaceFlinger riattiva la generazione di eventi VSYNC.

Offset VSYNC

L'app di sincronizzazione e SurfaceFlinger eseguono il rendering in loop sull'hardware VSYNC. In un evento VSYNC, il display inizia a mostrare il fotogramma N mentre SurfaceFlinger inizia a comporre le finestre per il fotogramma N+1 . L'app gestisce l'input in sospeso e genera il frame N+2 .

La sincronizzazione con VSYNC offre una latenza costante. Riduce gli errori nelle app e in SurfaceFlinger e riduce al minimo lo spostamento dei display dentro e fuori fase tra loro. Ciò presuppone che i tempi per frame dell'app e di SurfaceFlinger non varino ampiamente. La latenza è di almeno due fotogrammi.

Per rimediare a questo, puoi utilizzare gli offset VSYNC per ridurre la latenza da input a display rendendo il segnale dell'app e della composizione relativo all'hardware VSYNC. Ciò è possibile perché l'app più la composizione richiedono solitamente meno di 33 ms.

Il risultato dell'offset VSYNC è costituito da tre segnali con lo stesso periodo e fase di offset:

  • HW_VSYNC_0 : il display inizia a mostrare il fotogramma successivo.
  • VSYNC : l'app legge l'input e genera il frame successivo.
  • SF_VSYNC : SurfaceFlinger inizia la composizione per il fotogramma successivo.

Con l'offset VSYNC, SurfaceFlinger riceve il buffer e compone il frame mentre l'app elabora contemporaneamente l'input ed esegue il rendering del frame.

DisSync

DispSync mantiene un modello degli eventi VSYNC periodici basati su hardware di un display e utilizza tale modello per eseguire callback a sfasamenti di fase specifici dagli eventi VSYNC hardware.

DispSync è un loop ad aggancio di fase (PLL) software che genera i segnali VSYNC e SF_VSYNC utilizzati da Choreographer e SurfaceFlinger, anche se non compensati dal VSYNC hardware.

Flusso DisSync

Figura 1. Flusso DispSync

DispSync ha le seguenti qualità:

  • Riferimento : HW_VSYNC_0.
  • Uscita : VSYNC e SF_VSYNC.
  • Feedback : elimina i timestamp dei segnali di recinzione da Hardware Composer.

VSYNC/ritiro offset

Il timestamp del segnale delle recinzioni di ritiro deve corrispondere all'HW VSYNC, anche sui dispositivi che non utilizzano la fase di offset. Altrimenti, gli errori sembrano essere più gravi di quanto non siano. I pannelli intelligenti hanno spesso un delta in cui il recinto di ritiro è la fine dell'accesso diretto alla memoria (DMA) per visualizzare la memoria, ma il cambio di visualizzazione effettivo e HW VSYNC avviene qualche tempo dopo.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS è impostato nel makefile BoardConfig.mk del dispositivo. Si basa sul controller del display e sulle caratteristiche del pannello. Il tempo che intercorre tra il timestamp del recinto di ritiro e il segnale HW VSYNC viene misurato in nanosecondi.

Compensazioni 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 a 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.

Si nota più di un millisecondo o due di latenza. Per ridurre al minimo la latenza senza aumentare significativamente il numero di errori, integra test di errore automatizzati approfonditi.