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