La señal de VSync sincroniza la canalización de la pantalla. La canalización de pantalla consta del procesamiento de la app, la composición de SurfaceFlinger y el Hardware Composer (HWC) que presenta imágenes en la pantalla. VSync sincroniza el momento en que las apps se activan para comenzar el procesamiento, el momento en que SurfaceFlinger se activa para componer la pantalla y el ciclo de actualización de la pantalla. Esta sincronización elimina las interrupciones y mejora el rendimiento visual de los gráficos.
El HWC genera eventos de 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 eventos de VSync llamando a setVsyncEnabled
. SurfaceFlinger permite que setVsyncEnabled
genere eventos de VSync para que se pueda sincronizar con el ciclo de actualización de la pantalla. Cuando SurfaceFlinger se sincroniza con el ciclo de actualización de la pantalla, SurfaceFlinger inhabilita setVsyncEnabled
para evitar que el HWC genere eventos de VSync. Si SurfaceFlinger detecta una diferencia entre el VSync real y el VSync que estableció anteriormente, SurfaceFlinger vuelve a habilitar la generación de eventos VSync.
Desplazamientos de VSync
La app de sincronización y los bucles de renderización de SurfaceFlinger se sincronizan con el VSync de hardware. En un evento de VSync, la pantalla comienza a mostrar el fotograma N mientras que SurfaceFlinger comienza a componer ventanas para el fotograma N+1. La app controla la entrada pendiente y genera el fotograma N+2.
La sincronización con VSync ofrece una latencia coherente. Reduce los errores en las apps y en SurfaceFlinger, y minimiza las pantallas que se desincronizan entre sí. Esto supone que los tiempos por fotograma de la app y de SurfaceFlinger no varían demasiado. La latencia es de al menos dos fotogramas.
Para solucionar este problema, puedes emplear compensaciones de VSync para reducir la latencia de entrada a pantalla haciendo que la app y la señal de composición sean relativas al VSync de hardware. Esto es posible porque la composición de la app suele tardar menos de 33 ms.
El resultado de una compensación de VSync son tres señales con el mismo período y fase de compensación:
HW_VSYNC_0
: La pantalla comienza a mostrar el siguiente fotograma.VSYNC
: La app lee la entrada y genera el siguiente fotograma.SF_VSYNC
: SurfaceFlinger comienza la composición para el siguiente fotograma.
Con las compensaciones de VSync, SurfaceFlinger recibe el búfer y compone el fotograma mientras la app procesa la entrada y renderiza el fotograma de forma simultánea.
DispSync
DispSync mantiene un modelo de los eventos VSync periódicos basados en hardware de una pantalla y usa ese modelo para ejecutar devoluciones de llamada en desplazamientos de fase específicos desde los eventos VSync de hardware.
DispSync es un bucle de bloqueo de fase (PLL) de software que genera los indicadores VSYNC
y SF_VSYNC
que usan Choreographer y SurfaceFlinger, incluso si no se compensan con la sincronización vertical de hardware.
En la siguiente figura, se ilustra el flujo de DispSync:

Figura 1: Flujo de DispSync.
DispSync tiene las siguientes cualidades:
- Referencia:
HW_VSYNC_0
. - Salida:
VSYNC
ySF_VSYNC
. - Feedback: Retira las marcas de tiempo de la señal de la valla del HWC.
Compensaciones de retiro de VSync
La marca de tiempo del indicador de las barreras de retiro debe coincidir con la sincronización vertical del HW, incluso en los dispositivos que no usan la fase de desplazamiento. De lo contrario, los errores parecerán más graves de lo que son. Los paneles inteligentes suelen tener un delta en el que 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 la sincronización vertical de HW se producen algún tiempo después.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
se configura en el archivo makefile de BoardConfig.mk
del dispositivo. Se basa en las características del panel y el controlador de la pantalla. El tiempo desde la marca de tiempo de la valla de retiro hasta el signo de VSync de HW se mide en nanosegundos.
Compensaciones de 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 los casos de uso de carga alta, como la composición parcial de la GPU durante la transición de ventanas o el desplazamiento de Chrome por una página web que contiene animaciones. Estos desplazamientos permiten un tiempo de procesamiento de la app prolongado y un tiempo de composición de la GPU prolongado.
Se nota una latencia de más de uno o dos milisegundos. Para minimizar la latencia sin aumentar significativamente la cantidad de errores, integra pruebas de errores automatizadas exhaustivas.