Curso completo de DirectX 9 com C\C++
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 01-11
1.11 Compreendendo o backbuffer
1.1 Visão geral
Na melhor ordem das coisas os gráficos nunca são renderizados na tela
do monitor diretamente. Primeiro a cena é totalmente preparada numa
estrutura de memória chamada backbuffer e depois disso o backbuffer
pronto é transferido ou virado rapidamente para a tela do monitor.
Em nossos programas até o momento primeiro ocorre a renderização da
cena e depois do g_device->EndScene() ocorre a apresentação na tela
da imagem montada no backbuffer feita por g_device->Present().
Normalmente pode ocorrer a utilização de uma fila com vários
backbuffers antecipando vários quadros de animação e eles são virados
sequencialmente um após o outro sobre a tela ocasionando animações
rápidas e suaves. Geralmente essa fila de backbuffers é chamada de
corrente de trocas, swap chains no termo inglês do vocabulário do
directx.
A corrente de trocas é implementada como uma fila circular e assim
os backbuffers vão ocupando os próximos lugares desocupados dos
backbuffers que são apresentados ocorrendo um ciclo contínuo de
escrita nos backbuffers esvaziados e apresentando os que estão prontos.
* Diagrama adaptado da documentação original do directx.
Uma vez que a renderização pode ocorrer diretamente na tela ou pode
ocorrer em qualquer backbuffer existente na memória do computador ou
na memória da placa de vídeo surge o conceito do alvo da renderização
que pode apontar para essas formas que foram apresentadas.
Temos usado como último alvo da renderização uma janela mas podemos
escolher um outro controle do Windows como tela final ou ainda podemos
rodar nossa aplicação em modo fullscreen ou tela cheia.
Em contraste, aplicações gráficas que não fazem uso de backbuffer
apresentam efeitos visuais desagradáveis como a visão da formação da
cena, piscagens e flashes na tela, pedaços da cena anterior na
cena nova, animações travadas ou rápidas demais.
A implementação do processo de virar o backbuffer para o backbuffer
da frente ou para a tela imediata pode ocorrer através de uma simples
troca de endereço de memória que indica aonde a placa de vídeo deve
buscar os dados atuais de apresentação da cena. Com a aplicação em
modo janela a transferência de conteúdo pode consistir numa cópia de
conteúdo de um backbuffer para a área visível da janela.
Agora com essa compreensão do backbuffer é possível compreender melhor
a propriedade SwapEffect dos parâmetros de apresentação da cena, essa
propriedade está diretamente ligada com o gerenciamento da corrente
de trocas do dispositivo:
// Declara a variável para os parâmetros de apresentação
D3DPRESENT_PARAMETERS pps;
// (...)
pps.SwapEffect = D3DSWAPEFFECT_DISCARD;
pps.SwapEffect = D3DSWAPEFFECT_FLIP;
pps.SwapEffect = D3DSWAPEFFECT_COPY;
A opção Flip permuta conteúdo entre os backbuffers fazendo uma virada
de endereços; a opção Copy copia conteúdo de uma área para outra.
Quando selecionamos Discard o directx fica livre para tomar o melhor
caminho que seja o mais produtivo ao contexto de gerenciamento da
corrente de trocas no momento.
Pode ser criado correntes de trocas adicionais e isso geralmente é
necessário em aplicações que apresentam várias visualizações
diferentes de uma cena 3d no mesmo monitor.
Produzido por Gameprog: Jair Pereira - Agosto/2014 ©
gameprog.br@gmail.com
http://www.gameprog.com.br