Partilhar via


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 permuta é uma série de buffers que "viram" 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 estiver concluída. Isso evita o fenômeno conhecido como lacrimejamento e permite uma animação mais suave.

Cada dispositivo criado no Direct3D tem pelo menos uma cadeia de permuta. 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 permuta. A chamada para IDirect3D9::CreateDevice cria o dispositivo Direct3D e a cadeia de permuta correspondente.

Quando o utilizador usa IDirect3DDevice9::Present para solicitar uma operação de troca de superfície, os ponteiros para a memória de superfície para o buffer frontal e os buffers traseiros são trocados. A inversão é realizada alternando 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 invertida com um buffer frontal e dois buffers traseiros

Você pode criar cadeias de permuta adicionais para um dispositivo chamando IDirect3DDevice9::CreateAdditionalSwapChain. Uma aplicação pode criar uma cadeia de troca por vista e associar cada cadeia de troca a uma janela específica. O aplicativo renderiza imagens nos buffers traseiros de cada cadeia de permuta e, em seguida, apresenta-as 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 interfaceIDirect3DSwapChain9. De seguida, pode-se usar IDirect3DSwapChain9::Present para exibir o conteúdo do próximo back buffer no buffer frontal. Observe que um dispositivo só pode ter uma cadeia de permuta em tela cheia.

Você pode obter acesso a um buffer de retorno 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 de retorno. Observe que chamar este método aumenta o contador de referências interno na interface IDirect3DDevice9, portanto, certifique-se de chamar IUnknown quando terminar de usar essa superfície ou ocorrerá uma fuga de memória.

Lembre-se, o Direct3D inverte superfícies ao substituir os ponteiros de memória das superfícies dentro da cadeia de permuta, e não ao substituir as próprias superfícies. Isso significa que você sempre renderizará para o buffer traseiro que será exibido em seguida.

É importante notar a distinção entre uma "operação de inversão", como executada por um driver de adaptador de vídeo, e uma operação "Present" aplicada a uma swapchain criada com D3DSWAPEFFECT_FLIP.

O termo "flip" convencionalmente denota 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 é frequentemente usado de forma mais geral para descrever a apresentação de um buffer traseiro em qualquer cadeia de permuta criada com o efeito de permuta D3DSWAPEFFECT_FLIP.

Embora tais operações "Presentes" sejam quase invariavelmente implementadas por operações flip quando a cadeia de swap é de tela cheia, elas são necessariamente implementadas por operações de cópia quando a cadeia de swap é janelada. Além disso, um driver de adaptador de vídeo pode usar a técnica de flipping para implementar operações Present em cadeias de permuta em tela cheia baseadas nos D3DSWAPEFFECT_DISCARD e D3DSWAPEFFECT_COPY.

A discussão acima se aplica ao caso comumente usado de uma cadeia de permuta em tela cheia criada com D3DSWAPEFFECT_FLIP.

Para obter uma discussão mais geral sobre os diferentes efeitos de permuta para cadeias de permuta em janela e em tela cheia, consulte D3DSWAPEFFECT.

Superfícies Direct3D