O sinal VSYNC sincroniza o pipeline de exibição. O pipeline de exibição consiste na renderização do aplicativo, na composição do SurfaceFlinger e no Hardware Composer (HWC) apresentando imagens na tela. O VSYNC sincroniza o horário em que os aplicativos são ativados para iniciar a renderização, o horário em que o SurfaceFlinger é ativado para compor a tela e o ciclo de atualização da tela. Essa sincronização elimina interrupções e melhora o desempenho visual dos gráficos.
O HWC gera eventos VSYNC e os envia para SurfaceFlinger por meio do retorno de chamada:
typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData, hwc2_display_t display, int64_t timestamp);
SurfaceFlinger controla se o HWC gera ou não eventos VSYNC chamando setVsyncEnabled
. SurfaceFlinger permite setVsyncEnabled
gere eventos VSYNC para que possa sincronizar com o ciclo de atualização da exibição. Quando o SurfaceFlinger é sincronizado com o ciclo de atualização de exibição, o SurfaceFlinger desativa setVsyncEnabled
para impedir que o HWC gere eventos VSYNC. Se o SurfaceFlinger detectar uma diferença entre o VSYNC real e o VSYNC, ele estabeleceu anteriormente que o SurfaceFlinger reativará a geração de eventos VSYNC.
Deslocamento VSYNC
O aplicativo de sincronização e a renderização do SurfaceFlinger fazem loops para o VSYNC de hardware. Em um evento VSYNC, a exibição começa a mostrar o quadro N enquanto o SurfaceFlinger começa a compor janelas para o quadro N+1 . O aplicativo lida com entradas pendentes e gera o quadro N+2 .
A sincronização com VSYNC oferece latência consistente. Ele reduz erros em aplicativos e no SurfaceFlinger e minimiza a entrada e saída de fase entre as telas. Isso pressupõe que os tempos por quadro do aplicativo e do SurfaceFlinger não variem muito. A latência é de pelo menos dois quadros.
Para remediar isso, você pode empregar compensações VSYNC para reduzir a latência de entrada para exibição, tornando o sinal do aplicativo e da composição relativo ao VSYNC do hardware. Isso é possível porque o aplicativo mais a composição geralmente leva menos de 33 ms.
O resultado do deslocamento VSYNC são três sinais com o mesmo período e fase de deslocamento:
-
HW_VSYNC_0
— O display começa a mostrar o próximo quadro. -
VSYNC
— O aplicativo lê a entrada e gera o próximo quadro. -
SF_VSYNC
— SurfaceFlinger começa a compor para o próximo quadro.
Com o deslocamento VSYNC, o SurfaceFlinger recebe o buffer e compõe o quadro enquanto o aplicativo processa simultaneamente a entrada e renderiza o quadro.
DispSync
DispSync mantém um modelo de eventos VSYNC periódicos baseados em hardware de um display e usa esse modelo para executar retornos de chamada em deslocamentos de fase específicos dos eventos VSYNC de hardware.
DispSync é um loop de bloqueio de fase (PLL) de software que gera os sinais VSYNC e SF_VSYNC usados pelo Choreographer e SurfaceFlinger, mesmo que não seja compensado pelo VSYNC de hardware.
DispSync tem as seguintes qualidades:
- Referência — HW_VSYNC_0.
- Saída — VSYNC e SF_VSYNC.
- Feedback — Remova os carimbos de data/hora do sinal de fence do Hardware Composer.
VSYNC/retirar compensação
O carimbo de data/hora do sinal das cercas de retirada deve corresponder ao HW VSYNC, mesmo em dispositivos que não usam a fase de deslocamento. Caso contrário, os erros parecem ser mais graves do que são. Os painéis inteligentes geralmente têm um delta em que a barreira de desativação é o fim do acesso direto à memória (DMA) para exibir a memória, mas a troca de exibição real e o HW VSYNC ocorrem algum tempo depois.
PRESENT_TIME_OFFSET_FROM_VSYNC_NS
é definido no makefile BoardConfig.mk
do dispositivo. É baseado no controlador de exibição e nas características do painel. O tempo desde o carimbo de data/hora da cerca de retirada até o sinal HW VSYNC é medido em nanossegundos.
Deslocamentos VSYNC e SF_VSYNC
VSYNC_EVENT_PHASE_OFFSET_NS
e SF_VSYNC_EVENT_PHASE_OFFSET_NS
são definidos de forma conservadora com base em casos de uso de alta carga, como composição parcial da GPU durante a transição da janela ou rolagem do Chrome por uma página da web contendo animações. Essas compensações permitem um longo tempo de renderização do aplicativo e um longo tempo de composição da GPU.
Mais de um ou dois milissegundos de latência são perceptíveis. Para minimizar a latência sem aumentar significativamente a contagem de erros, integre testes de erros automatizados completos.