Curso completo de DirectX 9 com C\C++
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 01-11

index << >>


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.
index << >>

Produzido por Gameprog: Jair Pereira - Agosto/2014 © gameprog.br@gmail.com http://www.gameprog.com.br