VSYNC

O sinal VSYNC sincroniza o pipeline de exibição. O pipeline de exibição consiste na renderização do app, na composição do SurfaceFlinger e no compositor de hardware (HWC, na sigla em inglês) apresentando imagens na tela. O VSYNC sincroniza o momento em que os apps são ativados para iniciar a renderização, o momento em que o SurfaceFlinger é ativado para compor a tela e o ciclo de atualização da tela. Essa sincronização elimina a intermitência e melhora o desempenho visual dos gráficos.

O HWC gera eventos VSYNC e os envia para o SurfaceFlinger pelo callback:

typedef void (*HWC2_PFN_VSYNC)(hwc2_callback_data_t callbackData,
        hwc2_display_t display, int64_t timestamp);

O SurfaceFlinger controla se o HWC gera ou não eventos VSYNC chamando setVsyncEnabled. O SurfaceFlinger permite que setVsyncEnabled gere eventos VSYNC para que ele possa se sincronizar com o ciclo de atualização da tela. Quando o SurfaceFlinger é sincronizado com o ciclo de atualização da tela, ele desativa setVsyncEnabled para impedir que o HWC gere eventos VSYNC. Se o SurfaceFlinger detectar uma diferença entre a VSYNC real e a VSYNC estabelecida anteriormente, ele reativará a geração de eventos da VSYNC.

Deslocamento VSYNC

O app de sincronização e o SurfaceFlinger renderizam loops para o VSYNC de hardware. Em um evento VSYNC, a tela começa a mostrar o frame N enquanto o SurfaceFlinger começa a compor janelas para o frame N+1. O app processa a entrada pendente e gera o frame N+2.

A sincronização com o VSYNC oferece latência consistente. Ele reduz erros em apps e SurfaceFlinger e minimiza as telas que estão fora de fase umas com as outras. Isso pressupõe que os tempos por frame do app e do SurfaceFlinger não variem muito. A latência é de pelo menos dois frames.

Para corrigir isso, use os deslocamentos VSYNC para reduzir a latência de entrada para exibição fazendo com que o sinal do app e da composição seja relativo ao VSYNC de hardware. Isso é possível porque a composição do app mais o app geralmente leva menos de 33 ms.

O resultado do deslocamento VSYNC é três sinais com o mesmo período e fase de deslocamento:

  • HW_VSYNC_0: a tela começa a mostrar o próximo frame.
  • VSYNC: o app lê a entrada e gera o próximo frame.
  • SF_VSYNC: o SurfaceFlinger começa a composição para o próximo frame.

Com o deslocamento de VSYNC, o SurfaceFlinger recebe o buffer e compõe o frame enquanto o app processa simultaneamente a entrada e renderiza o frame.

DispSync

O DispSync mantém um modelo dos eventos VSYNC periódicos baseados em hardware de uma tela e usa esse modelo para executar callbacks em deslocamentos de fase específicos dos eventos VSYNC de hardware.

O DispSync é um loop de bloqueio de fase de software (PLL) que gera os sinais VSYNC e SF_VSYNC usados pelo Choreographer e pelo SurfaceFlinger, mesmo que não sejam deslocados do VSYNC de hardware.

Fluxo de DispSync

Figura 1. Fluxo de DispSync

A DispSync tem as seguintes qualidades:

  • Referência: HW_VSYNC_0.
  • Saída: VSYNC e SF_VSYNC.
  • Feedback: retire os carimbos de tempo do sinal de cerca do Hardware Composer.

VSYNC/retire offset

O carimbo de data/hora do sinal das cercas de aposentadoria precisa corresponder à VSYNC de hardware, 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 cerca de desativação é o fim do acesso direto à memória (DMA) para exibir a memória, mas a troca de tela real e a VSYNC de hardware são um pouco mais tarde.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS está definido no makefile BoardConfig.mk do dispositivo. Ele é baseado nas características do controlador de exibição e do painel. O tempo do carimbo de data/hora de exclusão para o sinal de VSYNC de hardware é medido em nanossegundos.

VSYNC e SF_VSYNC offsets

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 de GPU durante a transição de janela ou rolagem do Chrome em uma página da Web com animações. Esses deslocamentos permitem um tempo de renderização de app longo e um tempo de composição de GPU longo.

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.