reinterpretcast
No exemplo acima pode parecer inicialmente uma taxa de atualização de 0,26 Hz e um framerate de 0,2 FPS (Frames Per Second) pode estar perto o suficiente para ser exibido corretamente, no entanto é claro que assistindo a execução da demo que os dois estão completamente fora de sincronia e, portanto, o screen tearing ocorre regularmente.
O verdadeiro problema com este exemplo é que é uma ‘aplicação com um buffer único’. Nós escrevemos nossos frames diretamente no buffer que é alimentado no display, e assim quando o display quer atualizar sua imagem, há o risco de ele obter um frame que ainda não está completamente terminado. Em uma aplicação real o frame pode mudar drasticamente dependendo de certas circunstâncias, o que pode piorar este problema em aplicações com buffer único e tornar a tela ainda mais imprevisível.
Buffering Duplo
Uma maneira de aliviar alguns destes problemas é usar o buffer duplo. Este método de desenho consiste em escrever os dados do frame em um buffer traseiro, e depois copiá-los para o buffer primário (a alimentação de vídeo para o monitor) somente quando um frame estiver completo. Desta forma, o usuário nunca verá nenhum frame meio completado, certo? Errado.
Enquanto o rasgo da tela tende a ser reduzido significativamente com o buffer duplo, copiar os dados leva tempo, e como tal é completamente possível que o monitor atualize sua imagem pela metade do processo de cópia do buffer! Este problema pode ser visualizado exatamente como o rasgo com buffer único – na demo anterior, imagine que os pixels sendo escritos no buffer primário não são gerados diretamente pela placa gráfica, mas estão sendo colocados no buffer sequencialmente como resultado de uma operação de cópia de um buffer secundário.
Buffering duplo + VSync
Uma outra tática de alívio é usar VSync. Abreviação para ‘sincronização vertical’, VSync funciona apenas deixando o buffer traseiro escrever no buffer primário logo após o display ter sido atualizado. A esperança é que a operação de cópia do buffer esteja completa antes da próxima atualização. Isto funciona reduzindo drasticamente o rasgo da tela, no entanto tem seus problemas.
Se você tiver uma aplicação de alto framerate, o VSync normalmente funcionará perfeitamente. Seu framerate é limitado à taxa de atualização do seu monitor, mas isso é bom porque seu monitor estaria sendo exibido a essa taxa de qualquer maneira. O problema vem quando você atinge um framerate menor que a taxa de atualização do seu monitor.
Dizer que você estava atingindo 60 FPS em um monitor de 75 Hz – isso significa que o buffer de quadros está atualizando a 80% da taxa de atualização. Se o VSync estiver ativado, os quadros devem ser copiados para o buffer de tela em uma subdivisão da taxa de atualização. Neste caso, a aplicação perderá o ‘prazo’ em todos os outros ciclos, então acabaremos com metade da taxa de atualização como nosso framerate: 37,5 FPS. Isto é significativamente menor que os 60 FPS que a placa gráfica pode atingir.
O TL;DR para VSync com duplo tampão é que se você atingir um FPS consistentemente maior que sua taxa de atualização, pode ser uma boa idéia para reduzir o rasgo da tela, mas se o FPS cair abaixo da taxa de atualização de sua tela, o VSync pode reduzir significativamente o FPS.
Triplo buffer + VSync
O Santo Graal de toda esta confusão é normalmente triplo buffer com o VSync. O limite do VSync com buffer duplo é que o framerate pode diminuir significativamente devido ao tempo gasto à espera do tempo certo para copiar o buffer secundário para o buffer primário. Esperar muitas vezes não é uma idéia fantástica na ciência da computação onde pode ser evitada, então uma solução aqui é simplesmente adicionar outro buffer.
Com três buffers, os dois back buffers podem ser atraídos para alternadamente, então é sempre o caso de um buffer estar completo e outro em progresso. Isto significa que logo após uma atualização do monitor, qualquer buffer que esteja atualmente completo pode ser copiado para o buffer primário – fornecendo as vantagens do VSync sem a desvantagem de framerate previamente discutida.
A principal desvantagem do buffer triplo onde ele está disponível em aplicações é que ele ocupa mais memória – se estamos falando de placas gráficas, isto significa mais VRAM (Video RAM). Isto é memória rápida usada diretamente pela placa gráfica, e assim em alguns casos o buffer triplo pode causar uma queda significativa do FPS enquanto a RAM de maior latência é usada para compensar a falta de VRAM nativa. Tipicamente isto não é um grande problema, pois a quantidade de memória ocupada pelo terceiro buffer é frequentemente pequena em comparação com o tamanho total da VRAM, no entanto VSync com apenas dois buffers pode fornecer um melhor framerate em alguns casos de nicho! Swings e rotundas, eh?