VSYNC

O sinal VSYNC sincroniza o pipeline de exibição. A tela pipeline consiste na renderização do app, na composição do SurfaceFlinger e no Composer (HWC) apresentando imagens na tela. O VSYNC sincroniza a horário em que os aplicativos despertam para iniciar a renderização, o horário em que o SurfaceFlinger desperta para compor a tela e o ciclo de atualização da tela. Esta sincronização elimina a renderização lenta e melhora o desempenho visual dos gráficos.

O HWC gera eventos VSYNC e os envia ao SurfaceFlinger por meio o 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 eventos VSYNC pela chamando setVsyncEnabled. O SurfaceFlinger permite setVsyncEnabled para gerar eventos VSYNC para sincronizar com no ciclo de atualização da tela. Quando o SurfaceFlinger é sincronizado com o ciclo de atualização da tela, o SurfaceFlinger desativa setVsyncEnabled para impede que o HWC gere eventos VSYNC. Se o SurfaceFlinger detectar um diferença entre o VSYNC real e o VSYNC estabelecido anteriormente O SurfaceFlinger reativa a geração de eventos VSYNC.

Deslocamento de VSYNC

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

A sincronização com o VSYNC proporciona latência consistente. Reduz erros em e o SurfaceFlinger e minimiza as telas que entram e saem de fase com uns aos outros. Isso pressupõe que o app e o SurfaceFlinger por frame não variam muito. A latência é de pelo menos dois frames.

Para remediar isso, você pode usar deslocamentos VSYNC para reduzir a entrada para exibição a latência fazendo a relação entre o sinal do app e da composição e ao hardware VSYNC. Isso é possível porque o app e a composição normalmente levam menos que 33 ms.

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

  • HW_VSYNC_0: a exibição 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 do VSYNC, o SurfaceFlinger recebe o buffer e compõe o frame enquanto o app processa simultaneamente a entrada e renderiza do quadro.

DispSync

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

O DispSync é um loop de bloqueio de fase (PLL, na sigla em inglês) do software que gera a Sinais VSYNC e SF_VSYNC usados pelo Choreographer e SurfaceFlinger, mesmo se e não deslocado do VSYNC do hardware.

Fluxo do DispSync

Figura 1. Fluxo do DispSync

O DispSync tem as seguintes qualidades:

  • Referência: HW_VSYNC_0.
  • Saída: VSYNC e SF_VSYNC.
  • Feedback: remova os carimbos de data/hora de sinal de limite do Hardware Composer.

Compensação de VSYNC/remoção

O carimbo de data/hora do sinal de cercas de desativação precisa corresponder ao HW VSYNC, mesmo em dispositivos que não usam a fase de compensação. Caso contrário, os erros vão parecer mais graves do que são. Os painéis inteligentes costumam ter um delta onde a cerca é o fim de acesso direto à memória (DMA) para exibir a memória, mas a chave de exibição e o HW VSYNC será usado algum tempo depois.

PRESENT_TIME_OFFSET_FROM_VSYNC_NS está definido no Makefile BoardConfig.mk. Baseado no controlador de tela e no painel e as características determinantes. O horário do carimbo de data/hora do limite de retirada para o HW VSYNC é medido em nanossegundos.

Deslocamentos de VSYNC e SF_VSYNC

VSYNC_EVENT_PHASE_OFFSET_NS e SF_VSYNC_EVENT_PHASE_OFFSET_NS são definidos de maneira conservadora com base na casos de uso de alta carga, como composição parcial de GPU durante a transição de janela ou a rolagem do Chrome em uma página da Web com animações. Essas compensações permitem um longo tempo de renderização do app e um longo tempo de composição da GPU.

É perceptível latência acima de um ou dois milissegundos. Para minimizar a latência sem aumentar significativamente a contagem de erros, integrar erros automatizados testes.