Inverter superfícies (Direct3D 9)

Um aplicativo Direct3D normalmente exibe uma sequência animada gerando os quadros da animação em buffers traseiros e apresentando-os em sequência. Os buffers traseiros são organizados em cadeias de troca. Uma cadeia de troca é uma série de buffers que "inverter" para a tela um após o outro. Isso pode ser usado para renderizar uma cena na memória e, em seguida, inverter a cena para a tela quando a renderização for concluída. Isso evita o fenômeno conhecido como tearing e permite animação mais suave.

Cada dispositivo criado no Direct3D tem pelo menos uma cadeia de troca. Ao inicializar o primeiro dispositivo Direct3D, você define o membro BackBufferCount de D3DPRESENT_PARAMETERS, que informa ao Direct3D o número de buffers traseiros que estarão na cadeia de troca. A chamada para IDirect3D9::CreateDevice cria o dispositivo Direct3D e a cadeia de troca correspondente.

Quando você usa IDirect3DDevice9::P resent para solicitar uma operação de inversão de superfície, os ponteiros para a memória de superfície para o buffer frontal e buffers traseiros são trocados. A inversão é executada alternando os ponteiros que o dispositivo de exibição usa para referenciar a memória, não copiando a memória da superfície. Quando uma cadeia de inversão contém um buffer frontal e mais de um buffer traseiro, os ponteiros são alternados em um padrão circular, conforme mostrado no diagrama a seguir.

diagrama de uma cadeia de inversão com um buffer frontal e dois buffers traseiros

Você pode criar cadeias de troca de adição para um dispositivo chamando IDirect3DDevice9::CreateAdditionalSwapChain. Um aplicativo pode criar uma cadeia de troca por exibição e associar cada cadeia de troca a uma janela específica. O aplicativo renderiza imagens nos buffers traseiros de cada cadeia de troca e as apresenta individualmente. Os dois parâmetros que IDirect3DDevice9::CreateAdditionalSwapChain usa são um ponteiro para uma estrutura D3DPRESENT_PARAMETERS e o endereço de um ponteiro para uma interface IDirect3DSwapChain9 . Em seguida, você pode usar IDirect3DSwapChain9::P resent para exibir o conteúdo do próximo buffer traseiro para o buffer frontal. Observe que um dispositivo só pode ter uma cadeia de troca de tela inteira.

Você pode obter acesso a um buffer de back específico chamando os métodos IDirect3DDevice9::GetBackBuffer ou IDirect3DSwapChain9::GetBackBuffer , que retornam um ponteiro para uma interface IDirect3DSurface9 que representa a superfície de buffer voltar. Observe que chamar esse método aumenta a contagem de referência interna na interface IDirect3DDevice9 , portanto, certifique-se de chamar IUnknown quando terminar de usar essa superfície ou você terá um vazamento de memória.

Lembre-se de que o Direct3D inverte superfícies trocando ponteiros de memória de superfície dentro da cadeia de troca, não trocando as superfícies em si. Isso significa que você sempre será renderizado para o buffer traseiro que será exibido em seguida.

É importante observar a distinção entre uma "operação de inversão", conforme executado por um driver de adaptador de exibição, e uma operação "Presente" aplicada a uma cadeia de troca criada com D3DSWAPEFFECT_FLIP.

O termo "inverter" denota convencionalmente uma operação que altera o intervalo de endereços de memória de vídeo que um adaptador de vídeo usa para gerar seu sinal de saída, fazendo com que o conteúdo de um buffer traseiro anteriormente oculto seja exibido. No Direct3D 9, o termo geralmente é usado de forma mais geral para descrever a apresentação de um buffer traseiro em qualquer cadeia de troca criada com o efeito de troca D3DSWAPEFFECT_FLIP.

Embora essas operações "Presentes" sejam quase invariavelmente implementadas por operações de inversão quando a cadeia de troca é de tela inteira, elas são necessariamente implementadas por operações de cópia quando a cadeia de troca é janelada. Além disso, um driver de adaptador de exibição pode usar a inversão para implementar operações Presentes em cadeias de troca de tela inteira com base no D3DSWAPEFFECT_DISCARD e D3DSWAPEFFECT_COPY.

A discussão acima se aplica ao caso comumente usado de uma cadeia de troca de tela inteira criada com D3DSWAPEFFECT_FLIP.

Para obter uma discussão mais geral sobre os diferentes efeitos de troca para cadeias de troca em janelas e de tela inteira, consulte D3DSWAPEFFECT.

Superfícies Direct3D