VSYNC

Il segnale VSYNC sincronizza la pipeline di visualizzazione. Il display è composta da rendering dell'app, composizione di SurfaceFlinger e Composer (HWC) che mostra immagini sul display. VSYNC sincronizza l'ora in cui le app si riattivano per l'inizio del rendering, l'ora in cui SurfaceFlinger si riattiva alle lo schermo e il ciclo di aggiornamento del display. Questa sincronizzazione elimina le interruzioni e migliora le prestazioni visive delle immagini.

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 HWC genera o meno eventi VSYNC tramite chiamata al numero setVsyncEnabled. SurfaceFlinger consente setVsyncEnabled per 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 disattiva setVsyncEnabled per per impedire a HWC di generare eventi VSYNC. Se SurfaceFlinger rileva un differenza tra la VSYNC effettiva e la VSYNC stabilite in precedenza SurfaceFlinger riattiva la generazione di eventi VSYNC.

Offset VSYNC

L'app di sincronizzazione e SurfaceFlinger eseguono il rendering dei loop l'hardware VSYNC. In un evento VSYNC, il display inizia a mostrare il frame N mentre SurfaceFlinger inizia la composizione delle finestre per il frame N+1. L'app gestisce in attesa di input e genera il frame N+2.

La sincronizzazione con VSYNC garantisce una latenza coerente. Riduce gli errori di le app e SurfaceFlinger e riduce al minimo i movimenti in entrata e fuori fase dei display tra loro. Questo valore presuppone l'app e SurfaceFlinger per frame tempi non variano ampiamente. La latenza è di almeno due frame.

Per risolverlo, puoi utilizzare gli offset VSYNC per ridurre la quantità di input-to-display latenza rendendo il segnale app e di composizione relativo all'hardware VSYNC. Questo è possibile perché, in genere, l'app più la composizione richiedono meno tempo per più di 33 ms.

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

  • 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 frame mentre l'app elabora contemporaneamente l'input ed esegue il rendering il frame.

DispSync

DispSync gestisce un modello degli eventi VSYNC periodici basati su hardware di un e lo utilizza per eseguire i callback in una fase specifica dagli eventi VSYNC hardware.

DispSync è un loop di fase software (PLL) che genera I segnali VSYNC e SF_VSYNC utilizzati da Choreographer e SurfaceFlinger, anche se non compensato dall'offset VSYNC hardware.

Flusso DispSync

Figura 1. Flusso DispSync

DispSync ha le seguenti qualità:

  • Riferimento: HW_VSYNC_0.
  • Uscita: VSYNC e SF_VSYNC.
  • Feedback: ritira i timestamp dei segnali del recinto da Hardware Composer.

VSYNC/offset ritiro

Il timestamp del segnale relativo al ritiro delle recinzioni deve corrispondere a HW VSYNC, anche sui dispositivi che non usano la fase di offset. In caso contrario, gli errori sembrano essere più gravi più di quanto non siano. I pannelli smart spesso hanno un delta in cui la recinzione in pensione è la fine di accesso diretto alla memoria (DMA) per visualizzare la memoria, ma l'effettivo cambio di visualizzazione mentre HW VSYNC sarà un po' più avanti.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS impostata nel Makefile di BoardConfig.mk. Si basa sul controller e sul pannello caratteristiche. Il tempo che intercorre tra il timestamp del ritiro del recinto e l'HW VSYNC viene misurato in nanosecondi.

Offset VSYNC e SF_VSYNC

VSYNC_EVENT_PHASE_OFFSET_NS e I SF_VSYNC_EVENT_PHASE_OFFSET_NS sono impostati in modo conservativo in base a casi d'uso ad alto carico, come la composizione parziale della GPU durante la transizione delle finestre o Chrome che scorre una pagina web contenente animazioni. Queste compensazioni consentono lunghi tempi di rendering dell'app e lunghi tempi di composizione della GPU.

Puoi notare una latenza superiore a uno o due millisecondi. Per ridurre al minimo la latenza senza aumentare significativamente il numero di errori, integra errori automatici completi test.