La señal VSYNC sincroniza el canal de visualización. El proceso de visualización consta de la representación de la aplicación, la composición de SurfaceFlinger y el Hardware Composer (HWC) que presenta imágenes en la pantalla. VSYNC sincroniza la hora en que las aplicaciones se activan para comenzar a renderizar, la hora en que SurfaceFlinger se activa para componer la pantalla y el ciclo de actualización de la pantalla. Esta sincronización elimina la tartamudez y mejora el rendimiento visual de los gráficos.
El HWC genera eventos VSYNC y los envía a SurfaceFlinger a través de la devolución de llamada:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger controla si el HWC genera o no eventos VSYNC llamando a setVsyncEnabled
. SurfaceFlinger permite setVsyncEnabled
genere eventos VSYNC para que pueda sincronizarse con el ciclo de actualización de la pantalla. Cuando SurfaceFlinger se sincroniza con el ciclo de actualización de la pantalla, SurfaceFlinger deshabilita setVsyncEnabled
para evitar que HWC genere eventos VSYNC. Si SurfaceFlinger detecta una diferencia entre el VSYNC real y el VSYNC, SurfaceFlinger previamente establecido vuelve a habilitar la generación de eventos VSYNC.
Desplazamiento VSYNC
La aplicación de sincronización y SurfaceFlinger representan bucles al hardware VSYNC. En un evento VSYNC, la pantalla comienza a mostrar el cuadro N mientras SurfaceFlinger comienza a componer ventanas para el cuadro N+1 . La aplicación maneja la entrada pendiente y genera el cuadro N+2 .
La sincronización con VSYNC ofrece una latencia constante. Reduce los errores en las aplicaciones y SurfaceFlinger y minimiza las pantallas que entran y salen de fase entre sí. Esto supone que los tiempos por cuadro de la aplicación y SurfaceFlinger no varían mucho. La latencia es de al menos dos fotogramas.
Para remediar esto, puede emplear compensaciones de VSYNC para reducir la latencia de entrada a pantalla al hacer que la señal de la aplicación y la composición sea relativa al VSYNC del hardware. Esto es posible porque la aplicación y la composición suelen tardar menos de 33 ms.
El resultado del desplazamiento VSYNC son tres señales con el mismo período y fase de desplazamiento:
-
HW_VSYNC_0
: la pantalla comienza a mostrar el siguiente fotograma. -
VSYNC
: la aplicación lee la entrada y genera el siguiente fotograma. -
SF_VSYNC
: SurfaceFlinger comienza a componer para el siguiente fotograma.
Con el desplazamiento VSYNC, SurfaceFlinger recibe el búfer y compone el fotograma mientras la aplicación procesa simultáneamente la entrada y renderiza el fotograma.
DispSync
DispSync mantiene un modelo de eventos VSYNC periódicos basados en hardware de una pantalla y utiliza ese modelo para ejecutar devoluciones de llamada en desfases de fase específicos de los eventos VSYNC de hardware.
DispSync es un bucle de bloqueo de fase (PLL) de software que genera las señales VSYNC y SF_VSYNC utilizadas por Choreographer y SurfaceFlinger, incluso si no están compensadas con respecto al VSYNC del hardware.
![Flujo de sincronización de pantalla](https://source.android.com/static/docs/core/graphics/images/dispsync.png?authuser=1&hl=es)
Figura 1. Flujo de DispSync
DispSync tiene las siguientes cualidades:
- Referencia : HW_VSYNC_0.
- Salida : VSYNC y SF_VSYNC.
- Comentarios : retire las marcas de tiempo de las señales de valla de Hardware Composer.
VSYNC/retirar compensación
La marca de tiempo de la señal de las barreras de retirada debe coincidir con HW VSYNC, incluso en dispositivos que no utilizan la fase de compensación. De lo contrario, los errores parecen ser más graves de lo que son. Los paneles inteligentes a menudo tienen un delta donde la barrera de retiro es el final del acceso directo a la memoria (DMA) para mostrar la memoria, pero el cambio de pantalla real y HW VSYNC ocurre algún tiempo después.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
está configurado en el archivo MAKE BoardConfig.mk
del dispositivo. Se basa en el controlador de pantalla y las características del panel. El tiempo desde la marca de tiempo de retirada de la valla hasta la señal HW VSYNC se mide en nanosegundos.
Compensaciones VSYNC y SF_VSYNC
VSYNC_EVENT_PHASE_OFFSET_NS
y SF_VSYNC_EVENT_PHASE_OFFSET_NS
se configuran de forma conservadora en función de casos de uso de alta carga, como la composición parcial de GPU durante la transición de ventana o el desplazamiento de Chrome por una página web que contiene animaciones. Estas compensaciones permiten un tiempo de procesamiento de aplicaciones prolongado y un tiempo de composición de GPU prolongado.
Se nota más de uno o dos milisegundos de latencia. Para minimizar la latencia sin aumentar significativamente el número de errores, integre pruebas de errores automatizadas exhaustivas.