VSync (Vertical Synchronization) é uma tecnologia que sincroniza a saída de cada novo quadro da GPU com a taxa de atualização do display, eliminando rasgos de imagem. De acordo com Apple Metal Documentation, a sincronização com VBlank é obrigatória para renderização suave em dispositivos móveis. Screen tearing ocorre quando um quadro é atualizado durante a varredura vertical, e o VSync impede essa mistura.
Pontos principais
VSync (Vertical Synchronization) é um mecanismo hardware-software que força a GPU a aguardar o sinal de blanking vertical (VBlank) antes de exibir um novo quadro. Sem VSync, a GPU pode enviar quadros a qualquer momento, mesmo quando o display está no meio da renderização do quadro atual, causando rasgo de imagem ao longo de uma linha horizontal.
Em dispositivos móveis, o VSync é implementado no nível do driver gráfico e do sistema operacional. O iOS usa sincronização VBlank através do Metal, o Android através do SurfaceFlinger e BufferQueue. Com a sincronização vertical ativada, o FPS da aplicação não pode exceder a taxa de atualização do display — 60, 90 ou 120 Hz dependendo do modelo do dispositivo.
O termo sincronização vertical origina-se do princípio de funcionamento dos monitores CRT, onde um feixe de elétrons desenhava a imagem linha por linha de cima para baixo. Após completar um quadro, o feixe retornava ao canto superior esquerdo — este momento era chamado de blanking vertical. Os modernos displays LCD e OLED mantiveram este termo, embora fisicamente funcionem de forma diferente.
A GPU renderiza quadros no back buffer, enquanto o display lê do front buffer. O VSync garante que a troca de buffers ocorra apenas durante o VBlank — quando o display terminou de mostrar o quadro atual e está pronto para o próximo. Este mecanismo é chamado de double buffering com sincronização VBlank.
O double buffering usa dois buffers: um front buffer exibido na tela e um back buffer no qual a GPU escreve o quadro atual. Quando o quadro está pronto, os buffers são trocados. Com o VSync ativado, esta troca é adiada até o VBlank mais próximo. A GPU fica ociosa se o quadro estiver pronto antes do VBlank, reduzindo o desempenho mas eliminando o tearing.
// OpenGL — ativação de VSync via WGL_EXT_swap_control
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync ativado, 0 = desativado
VBlank é um curto intervalo entre a última linha do quadro atual e a primeira linha do próximo quadro. Durante este momento, o display não atualiza pixels e a troca de buffers ocorre sem artefatos. A duração do VBlank depende da taxa de atualização: a 60 Hz em um display 1080p, o VBlank dura aproximadamente 1.4 ms. Se a GPU não concluir a renderização antes do VBlank, o quadro é pulado e o display mostra o quadro anterior por mais um ciclo — isto é percebido como gaguejo.
O triple buffering resolve o problema de ociosidade da GPU adicionando um terceiro buffer. A GPU pode começar a renderizar o próximo quadro imediatamente, mesmo que um dos back buffers esteja aguardando VBlank. Isso aumenta o FPS com VSync mas adiciona um quadro extra de latência. Em dispositivos móveis, o triple buffering é usado em alguns motores de jogo e no Vulkan através do modo Mailbox.
VSync desativado fornece máximo FPS e mínimo input lag, mas ao custo de artefatos visuais. Para jogos móveis e aplicações com animação suave, a escolha entre VSync e sua desativação é um compromisso entre clareza de imagem e responsividade do controle.
Screen tearing é uma divisão horizontal onde a parte superior da tela mostra o quadro anterior e a parte inferior já mostra o próximo. Isso ocorre quando a GPU troca buffers durante a varredura. Em dispositivos móveis, o tearing é especialmente notável durante rolagem rápida ou em cenas dinâmicas com altas taxas de quadros. Telas OLED com sua resposta instantânea tornam o tearing mais contrastado em comparação com LCD.
A intensidade do tearing depende da relação entre FPS e taxa de atualização. A 60 FPS em um display de 60 Hz, o tearing aparece como uma única linha estática, enquanto a 300 FPS em 60 Hz aparecem múltiplos rasgos ondulados que se movem de cima para baixo. Quanto maior o FPS em relação à taxa de atualização, mais rasgos e mais visíveis eles se tornam.
O input lag com VSync é o atraso entre pressionar um botão e ver o resultado na tela. A sincronização vertical adiciona em média um quadro de latência (16.7 ms a 60 Hz), e com triple buffering — até dois quadros. Para aplicações casuais, este atraso é imperceptível, mas para shooters, jogos de luta e jogos rítmicos, é crítico: profissionais notam atrasos de até 8 ms.
De acordo com pesquisa da NVIDIA (2024), o input lag médio em CS:GO a 60 FPS sem VSync é de 22 ms, e com VSync — 39 ms. A 144 FPS, a diferença se reduz para 14 vs 18 ms respectivamente. Em plataformas móveis, o input lag do VSync é menos crítico devido à entrada por toque, onde a latência de hardware da tela sensível ao toque (10–30 ms) mascara o atraso adicional da sincronização.
No desenvolvimento móvel, o VSync é controlado através de APIs gráficas, motores de jogo e configurações do sistema operacional. O iOS oferece menos controle, o Android oferece mais através do Vulkan e OpenGL ES. A escolha do modo depende do tipo de aplicação: jogos, UI ou vídeo.
Unity usa a configuração QualitySettings.vSyncCount: 0 — desativado, 1 — VSync a cada VBlank, 2 — a cada segundo VBlank (FPS reduzido à metade). No Unreal Engine, o VSync é controlado através do comando de console r.VSync e DefaultEngine.ini. Para compilações móveis, recomenda-se desativar o VSync no Unity e usar um limitador de FPS personalizado, pois o VSync embutido no Android SurfaceFlinger pode criar atrasos imprevisíveis.
// Unity — controle de VSync e FPS
void Awake()
{
// 0 = VSync desativado, 1 = VSync ativado
QualitySettings.vSyncCount = 0;
// Limitador de FPS personalizado em vez de VSync
Application.targetFrameRate = 60;
}
Vulkan fornece controle total através de VkSwapchainPresentInfo e presentMode: VK_PRESENT_MODE_FIFO_KHR — VSync clássico, VK_PRESENT_MODE_MAILBOX_KHR — triple buffering sem espera, VK_PRESENT_MODE_IMMEDIATE_KHR — sem sincronização. Metal no iOS controla o VSync através de CAMetalLayer.displaySyncEnabled. A partir do iOS 14, a Apple recomenda usar displaySyncEnabled = true por padrão para todas as aplicações, exceto jogos de controle arcade.
| Modo | Descrição | Latência |
|---|---|---|
| FIFO | VSync clássico com espera VBlank | 1 quadro |
| Mailbox | Triple buffering, descartando quadros antigos | 1–2 quadros |
| Immediate | Sem sincronização, máximo FPS | 0 quadros |
Um limitador de FPS é uma alternativa ao VSync onde a aplicação limita a taxa de quadros programaticamente sem aguardar o VBlank. Esta abordagem fornece latência previsível e não depende da taxa de atualização do display. No Android, a limitação de FPS é implementada através do Choreographer, no iOS — através do CADisplayLink com controle manual do tempo de saída.
O VSync tradicional tem uma desvantagem fundamental: está vinculado a uma taxa de atualização fixa do display. Se a GPU produzir 45 FPS em um display de 60 Hz, o VSync não pode mostrar 45 quadros — ele mostra 30 (pulando cada segundo VBlank) ou alterna entre 60 e 30 com intervalos irregulares. Isso cria gaguejo, que estraga a experiência de jogo mais do que o tearing.
Adaptive Sync (FreeSync, G-Sync, Apple ProMotion) resolve este problema alterando dinamicamente a taxa de atualização do display de acordo com o FPS da aplicação. Se a aplicação produzir 47 FPS, o display muda para 47 Hz — cada quadro é exibido exatamente uma vez, sem rasgos ou gaguejo. O ProMotion no iOS seleciona automaticamente uma frequência de 24 a 120 Hz, equilibrando suavidade e consumo de energia.
Em dispositivos móveis, o Adaptive Sync está se tornando padrão: iPad Pro (2017+) com ProMotion, flagships Android com telas LTPO (Samsung Galaxy S23 Ultra, Google Pixel 8 Pro) suportam taxa de atualização dinâmica de 1 a 120 Hz. Para o desenvolvedor, isso significa que o VSync no sentido tradicional é substituído pelo gerenciamento do sistema — basta definir targetFrameRate, e o próprio SO ajusta a taxa de atualização para o equilíbrio ideal entre suavidade e duração da bateria.
Perguntas frequentes
Não. Para jogos dinâmicos (shooters, jogos de luta), o VSync aumenta o input lag sem benefício significativo — o tearing em telas OLED móveis é menos perceptível devido ao pequeno tamanho do display. Para jogos casuais e interfaces de usuário, o VSync melhora a percepção de suavidade.
O VSync reduz o consumo de energia porque a GPU não renderiza quadros desnecessários. Com o VSync desativado, a GPU opera na frequência máxima, e cada quadro não exibido desperdiça energia e aquece o dispositivo sem benefício para o usuário.
O VSync sincroniza a saída de quadros com o VBlank do display, enquanto um limitador de FPS simplesmente limita a frequência de renderização no código da aplicação. O limitador de FPS não elimina o tearing, mas fornece latência previsível sem estar vinculado à taxa de atualização da tela.
Quando a GPU não conclui um quadro antes do VBlank, o VBlank é pulado e o quadro é exibido por dois ciclos de atualização. A 60 Hz, isso resulta em 30 FPS. O triple buffering mitiga este efeito permitindo que a GPU comece o próximo quadro sem esperar.
Sim. O iOS ProMotion (iPad Pro, iPhone 13 Pro+) suporta frequência dinâmica de 24–120 Hz. O Android através de painéis LTPO suporta 1–120 Hz. O desenvolvedor não precisa gerenciar isso manualmente — o sistema seleciona a frequência ideal automaticamente.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também