Compartilhar via


Enumeração D3DSWAPEFFECT

Define os efeitos de troca.

Sintaxe

typedef enum D3DSWAPEFFECT { 
  D3DSWAPEFFECT_DISCARD      = 1,
  D3DSWAPEFFECT_FLIP         = 2,
  D3DSWAPEFFECT_COPY         = 3,
  D3DSWAPEFFECT_OVERLAY      = 4,
  D3DSWAPEFFECT_FLIPEX       = 5,
  D3DSWAPEFFECT_FORCE_DWORD  = 0xFFFFFFFF
} D3DSWAPEFFECT, *LPD3DSWAPEFFECT;

Constantes

D3DSWAPEFFECT_DISCARD

Quando uma cadeia de troca é criada com um efeito de troca de D3DSWAPEFFECT_FLIP ou D3DSWAPEFFECT_COPY, o runtime garantirá que uma operação IDirect3DDevice9::P resent não afetará o conteúdo de nenhum dos buffers de fundo. Infelizmente, atender a essa garantia pode envolver sobrecargas substanciais de processamento ou memória de vídeo, especialmente ao implementar semântica de inversão para uma cadeia de troca em janelas ou semântica de cópia para uma cadeia de troca de tela inteira. Um aplicativo pode usar o efeito de troca D3DSWAPEFFECT_DISCARD para evitar essas sobrecargas e permitir que o driver de exibição selecione a técnica de apresentação mais eficiente para a cadeia de troca. Esse também é o único efeito de troca que pode ser usado ao especificar um valor diferente de D3DMULTISAMPLE_NONE para o membro MultiSampleType do D3DPRESENT_PARAMETERS.

Como uma cadeia de troca que usa D3DSWAPEFFECT_FLIP, uma cadeia de troca que usa D3DSWAPEFFECT_DISCARD pode incluir mais de um buffer de fundo, qualquer um dos quais pode ser acessado usando IDirect3DDevice9::GetBackBuffer ou IDirect3DSwapChain9::GetBackBuffer. A cadeia de troca é melhor prevista como uma fila na qual 0 sempre indexa o buffer de fundo que será exibido pela próxima operação Present e da qual os buffers são descartados quando são exibidos.

Um aplicativo que usa esse efeito de troca não pode fazer suposições sobre o conteúdo de um buffer de fundo descartado e, portanto, deve atualizar um buffer de fundo inteiro antes de invocar uma operação Present que o exibiria. Embora isso não seja imposto, a versão de depuração do runtime substituirá o conteúdo de buffers back descartados por dados aleatórios para permitir que os desenvolvedores verifiquem se seus aplicativos estão atualizando as superfícies de buffer de fundo inteiras corretamente.

D3DSWAPEFFECT_FLIP

A cadeia de troca pode incluir vários buffers traseiros e é melhor prevista como uma fila circular que inclui o buffer frontal. Nessa fila, os buffers de fundo são sempre numerados sequencialmente de 0 para (n - 1), onde n é o número de buffers de fundo, de modo que 0 denota o buffer menos recentemente apresentado. Quando Present é invocado, a fila é "girada" para que o buffer frontal se torne buffer de fundo (n - 1), enquanto o buffer de fundo 0 se torna o novo buffer frontal.

D3DSWAPEFFECT_COPY

Esse efeito de troca pode ser especificado apenas para uma cadeia de troca que inclui um único buffer de fundo. Se a cadeia de troca estiver em janelas ou em tela inteira, o runtime garantirá a semântica implícita por uma operação Present baseada em cópia, ou seja, que a operação deixará o conteúdo do buffer de fundo inalterado, em vez de substituí-lo pelo conteúdo do buffer frontal como uma operação Present baseada em inversão faria.

Para uma cadeia de troca de tela inteira, o runtime usa uma combinação de operações de inversão e operações de cópia, com suporte, se necessário, por buffers back ocultos, para realizar a operação Present. Assim, a apresentação é sincronizada com o novo rastreamento vertical do adaptador de vídeo e sua taxa é restrita pelo intervalo de apresentação escolhido. Uma cadeia de troca especificada com o sinalizador D3DPRESENT_INTERVAL_IMMEDIATE é a única exceção. (Consulte a descrição do membro PresentationIntervals da estrutura D3DPRESENT_PARAMETERS .) Nesse caso, uma operação Present copia o conteúdo do buffer de fundo diretamente para o buffer frontal sem aguardar o novo rastreamento vertical.

D3DSWAPEFFECT_OVERLAY

Use uma área dedicada de memória de vídeo que pode ser sobreposta na superfície primária. Nenhuma cópia é executada quando a sobreposição é exibida. A operação de sobreposição é executada em hardware, sem modificar os dados na superfície primária.

Diferenças entre Direct3D 9 e Direct3D 9Ex:

  • D3DSWAPEFFECT_OVERLAY só está disponível no Direct3D9Ex em execução no Windows 7 (ou mais sistema operacional atual).

D3DSWAPEFFECT_FLIPEX

Designa quando um aplicativo está adotando o modo de inversão, durante o qual o quadro de um aplicativo é passado em vez de copiado para o DWM (Gerenciador de Janelas da Área de Trabalho) para composição quando o aplicativo está sendo apresentado no modo de janela. O modo Flip permite que um aplicativo use mais eficientemente a largura de banda de memória, bem como permitir que um aplicativo aproveite as estatísticas presentes em tela inteira. O modo de inversão não afeta o comportamento de tela inteira.

Observação

Se você criar uma cadeia de troca com D3DSWAPEFFECT_FLIPEX, não poderá substituir o membro hDeviceWindow da estrutura D3DPRESENT_PARAMETERS ao apresentar um novo quadro para exibição. Ou seja, você deve passar NULL para o parâmetro hDestWindowOverride de IDirect3DDevice9Ex::P resentEx para instruir o runtime a usar o membro hDeviceWindow do D3DPRESENT_PARAMETERS para a apresentação.

Diferenças entre Direct3D 9 e Direct3D 9Ex:

  • D3DSWAPEFFECT_FLIPEX só está disponível no Direct3D9Ex em execução no Windows 7 (ou mais sistema operacional atual).

D3DSWAPEFFECT_FORCE_DWORD

Força essa enumeração a ser compilada para 32 bits de tamanho. Sem esse valor, alguns compiladores permitiriam que essa enumeração fosse compilada em um tamanho diferente de 32 bits. Este valor não é usado.

Comentários

O estado do buffer de fundo após uma chamada para Present é bem definido por cada um desses efeitos de troca e se o dispositivo Direct3D foi criado com uma cadeia de troca de tela inteira ou uma cadeia de troca em janelas não tem efeito sobre esse estado. Em particular, o efeito de troca de D3DSWAPEFFECT_FLIP opera da mesma forma, seja em janelas ou em tela inteira, e o runtime do Direct3D garante isso criando buffers extras. Como resultado, é recomendável que os aplicativos usem D3DSWAPEFFECT_DISCARD sempre que possível para evitar tais penalidades. Isso ocorre porque esse efeito de troca sempre será o mais eficiente em termos de consumo de memória e desempenho.

Os aplicativos que usam D3DSWAPEFFECT_FLIP ou D3DSWAPEFFECT_DISCARD não devem esperar que o alfa de destino de tela inteira funcione. Isso significa que o estado de renderização D3DRS_DESTBLEND não funcionará conforme o esperado porque as cadeias de troca de tela inteira com esses efeitos de troca não têm um formato de pixel explícito do ponto de vista do driver. O driver infere que eles devem assumir o formato de exibição, que não tem um canal alfa. Para contornar isso, execute as seguintes etapas:

  • Use D3DSWAPEFFECT_COPY.
  • Verifique o sinalizador D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD no membro Caps3 da estrutura D3DCAPS9 . Esse sinalizador indica se o driver pode fazer a mesclagem alfa quando D3DSWAPEFFECT_FLIP ou D3DSWAPEFFECT_DISCARD é usado.
  • Os aplicativos que usam o efeito de troca do modo de inversão (D3DSWAPEFFECT_FLIPEX) devem chamar PresentEx após um redimensionamento de janela ou alteração de região para garantir que o conteúdo de exibição seja atualizado.

Uma janela invisível não pode receber eventos de modo de usuário; Além disso, uma janela de tela inteira invisível interferirá na apresentação da janela de modo em janela de outros aplicativos. Portanto, cada aplicativo precisa garantir que uma janela do dispositivo esteja visível quando uma cadeia de troca é apresentada no modo de tela inteira.

Requisitos

Requisito Valor
parâmetro
D3D9Types.h

Confira também

Enumerações direct3D

IDirect3DDevice9::Reset