VSYNC

La señal de VSYNC sincroniza la canalización de la pantalla. La canalización de la pantalla consiste en la renderización de la app, la composición de SurfaceFlinger y el compositor de hardware (HWC) que presenta imágenes en la pantalla. VSYNC sincroniza el momento en que las apps se activan para comenzar a renderizar, el momento en que SurfaceFlinger se activa para componer la pantalla y el ciclo de actualización de la pantalla. Esta sincronización elimina los bloqueos 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, 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 de VSYNC.

Desplazamiento de VSYNC

La app de sincronización y SurfaceFlinger renderizan bucles en la VSYNC de hardware. En un evento de VSYNC, la pantalla comienza a mostrar el fotograma N mientras SurfaceFlinger comienza a componer ventanas para el fotograma N+1. La app controla la entrada pendiente y genera la trama 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 desfasan y se vuelven a sincronizar entre sí. Esto supone que los tiempos por fotograma de la app y de SurfaceFlinger no varían mucho. La latencia es de al menos dos fotogramas.

Para solucionar este problema, puedes usar compensaciones de VSYNC para reducir la latencia de entrada a la pantalla haciendo que la app y el indicador de composición sean relativos a VSYNC de hardware. Esto es posible porque la app y la composición suelen tardar menos de 33 ms.

El resultado del desplazamiento de VSYNC son tres indicadores con el mismo período y la misma fase de desplazamiento:

  • 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 a componer el siguiente fotograma.

Con el desplazamiento 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 de VSYNC periódicos basados en hardware de una pantalla y usa ese modelo para ejecutar devoluciones de llamada en offsets de fase específicos de los eventos de 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 VSYNC de hardware.

Flujo de DispSync

Figura 1: Flujo de DispSync

DispSync tiene las siguientes cualidades:

  • Referencia: HW_VSYNC_0.
  • Salida: VSYNC y SF_VSYNC.
  • Feedback: Se quitaron las marcas de tiempo de los indicadores de cerca de Hardware Composer.

Compensación de VSYNC/retiro

La marca de tiempo del indicador de los cierres de jubilación debe coincidir con la VSYNC de HW, incluso en dispositivos que no usan la fase de offset. De lo contrario, los errores parecen ser más graves de lo que son. Los paneles inteligentes suelen tener un delta en el que la cerca de retiro es el final del acceso directo a la memoria (DMA) para mostrar la memoria, pero el interruptor de pantalla real y la VSYNC de HW se producen un tiempo después.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS se establece en el archivo makefile BoardConfig.mk del dispositivo. Se basa en las características del controlador de pantalla y del panel. El tiempo desde la marca de tiempo de la valla de retiro hasta la señal de VSYNC de HW se mide en nanosegundos.

Desplazamientos de VSYNC y SF_VSYNC

VSYNC_EVENT_PHASE_OFFSET_NS y SF_VSYNC_EVENT_PHASE_OFFSET_NS se establecen de forma conservadora en función de casos de uso de alta carga, como la composición parcial de la GPU durante la transición de la ventana o el desplazamiento de Chrome por una página web que contiene animaciones. Estos desfases permiten un tiempo de renderización de la app y un tiempo de composición de la GPU prolongados.

Se nota más de un milisegundo o dos de latencia. Para minimizar la latencia sin aumentar significativamente los recuentos de errores, integra pruebas de errores automatizadas exhaustivas.