Condividi tramite


Enumerazione D3DSWAPEFFECT

Definisce gli effetti di scambio.

Sintassi

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

Costanti

D3DSWAPEFFECT_DISCARD

Quando viene creata una catena di scambio con un effetto di scambio di D3DSWAPEFFECT_FLIP o D3DSWAPEFFECT_COPY, il runtime garantisce che un'operazione IDirect3DDevice9::P resent non influisca sul contenuto di uno dei buffer back. Purtroppo, la riunione di questa garanzia può comportare un notevole sovraccarico di memoria video o elaborazione, soprattutto quando si implementano semantiche di scorrimento per una catena di scambio finestrata o la semantica di copia per una catena di scambio a schermo intero. Un'applicazione può usare l'effetto di scambio D3DSWAPEFFECT_DISCARD per evitare questi sovraccarici e consentire al driver di visualizzazione di selezionare la tecnica di presentazione più efficiente per la catena di scambio. Questo è anche l'unico effetto di scambio che può essere usato quando si specifica un valore diverso da D3DMULTISAMPLE_NONE per il membro MultiSampleType di D3DPRESENT_PARAMETERS.

Come una catena di scambio che usa D3DSWAPEFFECT_FLIP, una catena di scambio che usa D3DSWAPEFFECT_DISCARD può includere più buffer back, una qualsiasi delle quali può essere accessibile usando IDirect3DDevice9::GetBackBuffer o IDirect3DSwapChain9::GetBackBuffer. La catena di scambio è consigliata come coda in cui 0 indicizza sempre il buffer indietro che verrà visualizzato dall'operazione Presente successiva e da cui vengono eliminati i buffer quando sono stati visualizzati.

Un'applicazione che usa questo effetto di scambio non può fare ipotesi sul contenuto di un buffer back rimosso e quindi aggiornare un intero buffer back prima di richiamare un'operazione Presente che la visualizzerebbe. Anche se questa operazione non viene applicata, la versione di debug del runtime sovrascriverà il contenuto dei buffer back eliminati con dati casuali per consentire agli sviluppatori di verificare che le applicazioni aggiornino correttamente l'intero buffer back.

D3DSWAPEFFECT_FLIP

La catena di scambio può includere più buffer indietro ed è meglio prevista come coda circolare che include il buffer anteriore. All'interno di questa coda, i buffer back vengono sempre numerati in sequenza da 0 a (n - 1), dove n è il numero di buffer back, in modo che 0 indica il buffer meno recente presentato. Quando Presente viene richiamato, la coda viene "ruotata" in modo che il buffer front-end diventi buffer indietro (n - 1), mentre il buffer posteriore 0 diventa il nuovo buffer front-end.

D3DSWAPEFFECT_COPY

Questo effetto di scambio può essere specificato solo per una catena di scambio che comprende un singolo buffer back. Indipendentemente dal fatto che la catena di scambio sia finestrata o schermo intero, il runtime garantisce la semantica implicita da un'operazione Presente basata su copia, ovvero che l'operazione lascia invariato il contenuto del buffer indietro, anziché sostituirlo con il contenuto del buffer anteriore come operazione Presente basata su capovolgimento.

Per una catena di scambio a schermo intero, il runtime usa una combinazione di operazioni di capovolgimento e operazioni di copia, supportate se necessario dai buffer back nascosti, per eseguire l'operazione Presente. Di conseguenza, la presentazione viene sincronizzata con la ritraccia verticale dell'adattatore di visualizzazione e la relativa frequenza è vincolata dall'intervallo di presentazione scelto. Una catena di scambio specificata con il flag di D3DPRESENT_INTERVAL_IMMEDIATE è l'unica eccezione. Fare riferimento alla descrizione del membro PresentationIntervals della struttura D3DPRESENT_PARAMETERS . In questo caso, un'operazione Presente copia il contenuto del buffer indietro direttamente nel buffer anteriore senza attendere la ritraccia verticale.

D3DSWAPEFFECT_OVERLAY

Usare un'area dedicata di memoria video che può essere sovrapposta sulla superficie primaria. Nessuna copia viene eseguita quando viene visualizzata la sovrapposizione. L'operazione di sovrapposizione viene eseguita nell'hardware, senza modificare i dati nella superficie primaria.

Differenze tra Direct3D 9 e Direct3D 9Ex:

  • D3DSWAPEFFECT_OVERLAY è disponibile solo in Direct3D9Ex in esecuzione in Windows 7 (o più sistema operativo corrente).

D3DSWAPEFFECT_FLIPEX

Definisce quando un'applicazione adotta la modalità di scorrimento, durante la quale il frame di un'applicazione viene passato anziché copiato in Gestione finestre desktop (DWM) per la composizione quando l'applicazione viene presentata in modalità finestra. La modalità Flip consente a un'applicazione di usare in modo più efficiente la larghezza di banda della memoria e di consentire a un'applicazione di sfruttare le statistiche presenti a schermo intero. La modalità flip non influisce sul comportamento a schermo intero.

Nota

Se si crea una catena di scambio con D3DSWAPEFFECT_FLIPEX, non è possibile eseguire l'override del membro hDeviceWindowdella struttura D3DPRESENT_PARAMETERS quando si presenta un nuovo frame per la visualizzazione. Vale a dire, è necessario passare NULL al parametro hDestWindowOverride di IDirect3DDevice9Ex::P resentEx per indicare al runtime di usare il membro hDeviceWindow di D3DPRESENT_PARAMETERS per la presentazione.

Differenze tra Direct3D 9 e Direct3D 9Ex:

  • D3DSWAPEFFECT_FLIPEX è disponibile solo in Direct3D9Ex in esecuzione in Windows 7 (o più sistema operativo corrente).

D3DSWAPEFFECT_FORCE_DWORD

Forza questa enumerazione per la compilazione in 32 bit di dimensioni. Senza questo valore, alcuni compilatori consentono la compilazione di questa enumerazione in una dimensione diversa da 32 bit. Questo valore non viene utilizzato.

Commenti

Lo stato del buffer indietro dopo una chiamata a Present è ben definito da ognuno di questi effetti di scambio e se il dispositivo Direct3D è stato creato con una catena di scambio a schermo intero o una catena di scambio con finestre non ha alcun effetto su questo stato. In particolare, l'effetto di scambio D3DSWAPEFFECT_FLIP opera lo stesso se finestrato o schermo intero e il runtime Direct3D garantisce questa operazione creando buffer aggiuntivi. Di conseguenza, è consigliabile che le applicazioni usino D3DSWAPEFFECT_DISCARD ogni volta che è possibile evitare eventuali sanzioni. Questo perché questo effetto di scambio sarà sempre il più efficiente in termini di consumo di memoria e prestazioni.

Le applicazioni che usano D3DSWAPEFFECT_FLIP o D3DSWAPEFFECT_DISCARD non devono essere eseguite dall'alfa della destinazione a schermo intero. Ciò significa che lo stato di rendering D3DRS_DESTBLEND non funzionerà come previsto perché le catene di scambio a schermo intero con questi effetti di scambio non hanno un formato pixel esplicito dal punto di vista del driver. Il driver inferisce che devono assumere il formato di visualizzazione, che non ha un canale alfa. Per risolvere questo problema, seguire questa procedura:

  • Usare D3DSWAPEFFECT_COPY.
  • Controllare il flag D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD nel membro Caps3 della struttura D3DCAPS9 . Questo flag indica se il driver può eseguire la fusione alfa quando viene usato D3DSWAPEFFECT_FLIP o D3DSWAPEFFECT_DISCARD.
  • Le applicazioni che usano l'effetto di scambio in modalità flip (D3DSWAPEFFECT_FLIPEX) devono chiamare PresentEx dopo una modifica di ridimensionamento o area della finestra per assicurarsi che il contenuto visualizzato venga aggiornato.

Una finestra invisibile non può ricevere eventi in modalità utente; inoltre, una finestra a schermo intero invisibile interferirà con la presentazione di una finestra in modalità finestra di un'altra applicazione. Pertanto, ogni applicazione deve assicurarsi che una finestra del dispositivo sia visibile quando viene presentata una swapchain in modalità schermo intero.

Requisiti

Requisito Valore
Intestazione
D3D9Types.h

Vedi anche

Enumerazione Direct3D

IDirect3DDevice9::Reset