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.
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.