Img_normal

Conforme você deve ter conferido em um artigo recente do TecMundo Games, o método computacional conhecido como double buffering é responsável por um verdadeiro salto qualitativo no processamento e na exibição de imagens em um game.

Para os casos em que o “technês” poderia se tornar excessivamente pesado — ou abstrato —, nós chegamos mesmo a organizar as informações na forma de uma analogia simples, embora de gosto duvidoso, envolvendo uma tarde ensolarada e aquela sua piscina de 1000 litros.

Afinal, tratava-se da forma mais natural de entender como, afinal, um espaço de armazenamento secundário poderia ser relevante para a sustentação dos belos gráficos do seu jogo favorito — evitando falhas desagradáveis como o tearing (imagem cortada)e o flickering (imagem tremeluzente).

Mas eis uma revelação: o double buffering não representa a única forma de se manter uma “linha de montagem” coerente para as imagens que são exibidas na sua tela. De fato, sequer é a mais funcional para uma enorme gama de aplicativos. Dessa forma, como uma evolução necessária do mesmo padrão, surge o triple buffering.

De forma resumida? Trata-se tão somente da inclusão de um terceiro buffer (espaço de armazenamento temporário da memória). Entretanto, essa modificação aparentemente simples é capaz de produzir efeitos de performance e qualidade invejáveis, conforme transforma monitor e unidade de processamento gráficos unidades independentes. Enfim, vamos ver como isso realmente funciona.

Um terceiro buffer...... E uma alternativa para a sincronização vertical (vsync)

Para entender o funcionamento do triple buffer é realmente imprescindível que se compreenda como a sua tecnologia imediatamente anterior, o double buffering, funciona. Afinal, o buffer triplo surgiu exatamente para corrigir uma insuficiência óbvia desse último.

Fonte: Anandtech.com

Nos primórdios da computação gráfica, era comum que se utilizasse apenas um buffer — ou, apenas um espaço para o armazenamento temporário de dados. Naturalmente, havia vantagens inerentes a essa escolha, embora os inconvenientes rapidamente tenham saltado à vista. Notadamente, a utilização de um único buffer ocasionava lampejos na tela sempre que a imagem exibida era atualizada.

Resolveu-se, portanto, acrescentar um buffer extra, em uma saída bastante óbvia: em vez de ficar aguardando que um único espaço de armazenamento (front buffer) fosse esvaziado para então começar a processar a próxima imagem, o processador gráfico poderia agora contar com um espaço extra (back buffer), podendo então desenhar a próxima imagem mesmo antes de a anterior ter sido exibida na tela.

Pronto ou não... Lá vai a imagem!

Mas há um inconveniente nesse processo: a troca de buffers se dá sem prévio aviso, assim como a exibição da imagem que aguardava no buffer frontal. Em outras palavras, uma vez que o processador tenha terminado de construir a próxima imagem no back buffer, aquela imagem que aguardava para ser exibida será imediatamente enviada para a tela, desembocando em um efeito bastante desagradável: o screen tearing, que são imagens justapostas — ou o clássico “corte” que aparece no meio do monitor.

Fonte: Techpubs.sgi.com

Isso ocorre em razão da falta de sincronia entre o processador gráfico e o monitor, o que faz com que este exiba imagens não inteiramente concluídas. A princípio, resolve-se esse problema “forçando” uma sincronia entre monitor e processador, procedimento conhecido como “sincronização vertical”, ou simplesmente vsync (vertical synchronizing).

Só que outro inconveniente surge nesse ponto: forçar a sincronização entre os dispositivos mencionados ocasiona, invariavelmente, uma queda na taxa de quadros exibidos por segundo (fps, ou, frames per second). Quer dizer, invariavelmente ocorrerão casos em que a imagem no front buffer, embora esteja concluída, apenas poderá ser exibida na próxima atualização do monitor — mesmo que o ganho qualitativo para a imagem exibida seja considerável. Mas há uma saída.

Processamento gráfico contínuoDesvinculando monitor e processador gráfico

A fim de evitar o efeito screen tearing (buffer duplo) e também a lentidão no processamento de imagens (buffer duplo com vsync), adiciona-se, por fim, um terceiro espaço de armazenamento temporário. Ou, em outros termos, surge a estrutura de processamento convencionalmente denominada triple bufferging.

A solução proposta pela estrutura de três buffers é tão simples e intuitiva quanto funcional. A adição de um terceiro espaço temporário permite o “travamento” do buffer frontal, que apenas será esvaziado de acordo com a atualização do monitor.

Fonte: Anandtech.com

Paralelamente, o processador gráfico não estará mais constrangido pela velocidade de exibição do monitor. Uma vez que tenha concluído uma tela a ser exibida, basta que ele comece a trabalhar na tela seguinte, que será, portanto, armazenada no segundo back buffer. Dessa forma, o processador pode trabalhar livremente à maior velocidade possível — já que não dependerá do esvaziamento de um único buffer de apoio para iniciar a construção da tela seguinte.

Em outras palavras, o software permanece “desenhando” o tempo todo por trás das cortinas, utilizando para tanto os doisbuffers de apoio da estrutura, de forma que, sempre que a troca entre back buffer e front buffer ocorrer, não haverá qualquer tipo de efeito secundário — lentidão ou “cortes” na tela.

Por fim, embora o triple buffering traga inconvenientes como qualquer método computacional — no caso, a utilização constante de um espaço extra na memórica —, é fácil perceber que a utilização de dois buffers de apoio é perfeitamente capaz de manter, simultaneamente, o desempenho de uma estrutura de dois buffers simples e o nível de qualidade obtido através da sincronização vertical (vsync). Em termos práticos: gráficos ao mesmo tempo fluídos e bem construídos.