Enumeração D3DSWAPEFFECT

Define 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 traseiros. Infelizmente, atender a essa garantia pode envolver sobrecargas substanciais de memória de vídeo ou processamento, 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 de 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 traseiro, 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 traseiro que será exibido pela próxima operação Presente e da qual os buffers são descartados quando são exibidos.

Um aplicativo que usa esse efeito de troca não pode fazer nenhuma suposição sobre o conteúdo de um buffer traseiro descartado e, portanto, deve atualizar um buffer traseiro 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 com dados aleatórios para permitir que os desenvolvedores verifiquem se seus aplicativos estão atualizando todas as superfícies de buffer traseiro 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. Dentro dessa fila, os buffers traseiros são sempre numerados sequencialmente de 0 para (n - 1), em que n é o número de buffers traseiros, de modo que 0 indica o buffer menos recentemente apresentado. Quando Presente é invocado, a fila é "girada" para que o buffer frontal se torne buffer traseiro (n - 1), enquanto o buffer traseiro 0 se torna o novo buffer frontal.

D3DSWAPEFFECT_COPY

Esse efeito de troca pode ser especificado apenas para uma cadeia de troca que compreende um único buffer de fundo. Se a cadeia de troca estiver em janela 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 deixa o conteúdo do buffer traseiro inalterado, em vez de substituí-lo pelo conteúdo do buffer frontal como uma operação Present baseada em flip.

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 Presente. Assim, a apresentação é sincronizada com o novo rastreamento vertical do adaptador de exibição 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 traseiro 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 de forma mais eficiente 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 no sistema operacional mais atual).

D3DSWAPEFFECT_FORCE_DWORD

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

Comentários

O estado do buffer traseiro após uma chamada para Presente é 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 nesse 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 essas penalidades. Isso ocorre porque esse efeito de troca sempre será o mais eficiente em termos de consumo e desempenho de memória.

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 D3DRS_DESTBLEND estado de renderização 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 ele deve 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 de 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 do 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