VSync

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 se activan las apps para comenzar el procesamiento, el momento en que se activa SurfaceFlinger 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 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 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 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 usar compensaciones de VSync para reducir la latencia de entrada a pantalla haciendo que los indicadores de composición y de la app sean relativos al VSync de hardware. Esto es posible porque la composición de la app y el signo más 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 desfases de fase específicos a partir de 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:

Flujo de DispSync

Figura 1: Flujo de DispSync.

DispSync tiene las siguientes cualidades:

  • Referencia: HW_VSYNC_0.
  • Resultado: VSYNC y SF_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 de 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 BoardConfig.mk del dispositivo. Se basa en las características del panel y el controlador de pantalla. El tiempo desde la marca de tiempo de la valla de retiro hasta el signo de HW VSync 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 renderización de la app y un tiempo de composición de la GPU prolongados.

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.