Sem necessidade para um blog

Atualizando a tela e entendendo o que é flickering e tearing

Esses dias eu estava passeando na PDJ e vi este post aqui perguntando sobre o Triple Buffering. Achei então que seria um bom assunto para o novo artigo do blog. Dei uma pesquisada boa, já que estou muito enferrujado no assunto, e vou apresentar aqui uma explicação sobre o que é flickering, tearing, v-sync e o conceito atrás das técnicas de double buffering, page flipping, triple buffering e dirty rectangles.

Flickering

O famoso flicker é quando a tela dá a famosa piscada. Esse efeito é muito desagradável e até cansa a vista quando acontece. Ele acontece porque a tela é diretamente apagada e desenhada novamente para apresentar o próximo quadro sem utilizar o sincronismo vertical, o também famoso v-sync.

Tearing

O tear em português é traduzido para lágrima se refere ao verbo rasgar (valeu Gabriel), e é o efeito que ocorre quando um quadro novo sobrepõe parte de um antigo. Este defeito ocorre principalmente quando há movimento de câmera. Veja a imagem de exemplo para você entender melhor, e observe como as paredes estão tortas:

O efeito tearing

Isso ocorre porque a placa de vídeo consegue produzir mais quadros do que o monitor consegue mostrar e o sincronismo vertical está desligado.

V-sync

O v-sync é o sincronismo vertical. Ele é necessário principalmente por uma limitação física dos monitores CRT. Estes monitores precisam iluminar constantemente o fósforo várias vezes por segundo para manter uma imagem na tela, e faz isso um determinado número de vezes por segundo, sendo que esse número, que é a frequência vertical do monitor, e é baseado em quão rápido o canhão de elétrons consegue se mover. Quando o canhão se move da última linha até a primeira para fazer novamente o desenho. Esse tempo que o canhão leva pra voltar ao começo da tela é chamado de vblank, ou vertical blanking interval. No caso de monitores LCD, mesmo eles não tendo esta limitação eles também possuem o vsync. No LCD, os pixels continuam ligados até eles serem informados para mudar, entretanto, eles precisam perguntar para a placa de vídeo se há outros quadros para exibir. É por isso que eles tem uma taxa de atualização mesmo não precisando de uma.

Enfim, quando você o deixa desabilitado, a placa de vídeo pode produzir os quadros a toda velocidade e mandar pra tela, mas a tela não consegue acompanhar, causando o tearing, e caso você esteja limpando e desenhando direto na tela, também causa o flickering. Para evitar o flickering, você pode usar as técnicas de double buffering, page flipping, triple buffering e dirty rectangles. Mas mesmo com essas técnicas, o tearing ainda pode aparecer.

Para eliminar o tearing, é preciso ligar o v-sync. Então é só ligar o v-sync e seus problemas acabaram certo? Errado! Se o tempo que leva para processar e desenhar a imagem for muito grande, a taxa de quadros por segundo pode acabar na metade da taxa de atualização da tela, porque a placa de vídeo tem que esperar mais de um vblank para desenhar o quadro. Isto é resolvido tendo mais de um buffer para desenhar, o chamado triple buffering.

Concluindo o v-sync, o jeito de saber se vale a pena ou não deixar ele ligado é experimentando mesmo.

Double buffering

Técnica usada para eliminar o flicker bastante simples. É simplesmente uma imagem fora da tela onde os quadros são renderizados. Após a renderização, é feito o blit (cópia) dessa imagem para a tela de uma vez. Sem o v-sync ligado, causa o tearing.

Double buffering

Dirty rectangles

Variação do double buffering, onde apenas algumas regiões da imagem renderizada em um buffer são copiadas para a tela. Muito eficiente quando há pouca movimentação na tela.

Page flipping

Traduzindo para o português significa troca de página, e é exatamente o que ocorre. São criadas na memória de vídeo duas imagens do tamanho da tela. Enquanto uma está sendo exibida, a outra é renderizada. Após renderizar, o ponteiro para a imagem da tela é trocado fazendo com que a imagem que foi renderizada seja a ativa na tela, deixando a outra para renderizar o próximo quadro. A diferença para o double buffering é que não existe a cópia do buffer para a tela, só a troca dos ponteiros da tela, e praticamente elimina o tearing pois espera sempre o v-blank do v-sync.

Page flipping

Triple buffering

Algumas vezes é vantajoso ter mais de um buffer na memória de vídeo, especialmente quando o desenho leva uma quantidade de tempo maior que a taxa de atualização do monitor. É preciso ter então a imagem apresentada para a tela e mais duas de buffer. Enquanto uma imagem é exibida, a renderização acaba e pede pra trocar para a próxima imagem mas não precisa ficar esperando o v-blank e pode ir continuando o processamento.

Conclusões

Bom, agora se você ouvir falar de termos como tearing, flickering, v-sync, v-blank, double buffer, page flip, triple buffer e dirty rectangles (ufa!) você já tem uma idéia do que é tudo isso. Em um outro artigo, colocarei alguma(s) implementações disso. Enquanto não escrevo, vocês podem ver uma implementação em C no demo do allegro.

Referências

2 comentários para “Atualizando a tela e entendendo o que é flickering e tearing”

  1. gabriel disse:

    ótimo texto cara!
    Só uma correção, o ‘tear’ não se refere a lágrima neste caso, e sim ao verbo rasgar.

  2. dudaskank disse:

    Opa, obrigado pela dica! Vou corrigir já :)

Deixe um comentário