La señal VSYNC sincroniza la tubería de visualización. La canalización de visualización consta de la representación de la aplicación, la composición de SurfaceFlinger y el compositor de hardware (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 el tartamudeo y mejora el rendimiento visual de los gráficos.
El HWC genera eventos VSYNC y envía los eventos 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 que 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 el 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.
Compensación VSYNC
La aplicación de sincronización y el procesamiento de SurfaceFlinger se repiten en el hardware VSYNC. En un evento VSYNC, la pantalla comienza a mostrar el cuadro N mientras que SurfaceFlinger comienza a componer ventanas para el cuadro N+1 . La aplicación maneja la entrada pendiente y genera el marco N+2 .
La sincronización con VSYNC ofrece una latencia constante. Reduce los errores en las aplicaciones y SurfaceFlinger y minimiza las pantallas que se sincronizan y desfasan 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 VSYNC para reducir la latencia de entrada a pantalla al hacer que la señal de la aplicación y la composición se relacione con el hardware VSYNC. Esto es posible porque la composición de app plus suele tardar menos de 33 ms.
El resultado de la compensación VSYNC son tres señales con el mismo período y fase compensada:
-
HW_VSYNC_0
: la pantalla comienza a mostrar el siguiente cuadro. -
VSYNC
: la aplicación lee la entrada y genera el siguiente cuadro. -
SF_VSYNC
: SurfaceFlinger comienza a componer para el siguiente cuadro.
Con el desplazamiento VSYNC, SurfaceFlinger recibe el búfer y compone el cuadro mientras la aplicación procesa la entrada y representa el cuadro simultáneamente.
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 compensaciones de fase específicas 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 se compensan con el hardware VSYNC.
![Flujo DispSync](https://source.android.google.cn/static/devices/graphics/images/dispsync.png?authuser=7&hl=es-419)
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 la señal de la cerca de Hardware Composer.
Desplazamiento VSYNC/Retiro
La marca de tiempo de la señal de las cercas de retiro debe coincidir con HW VSYNC, incluso en dispositivos que no usan 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 valla 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 es un tiempo posterior.
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 del cerco de retiro 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 según los casos de uso de alta carga, como la composición de GPU parcial durante la transición de ventana o el desplazamiento de Chrome a través de una página web que contiene animaciones. Estas compensaciones permiten un tiempo de renderizado de aplicaciones prolongado y un tiempo de composición de GPU prolongado.
Se nota más de un milisegundo o dos de latencia. Para minimizar la latencia sin aumentar significativamente el número de errores, integre pruebas de error automatizadas exhaustivas.