D3DSWAPEFFECT-Enumeration

Definiert Auslagerungseffekte.

Syntax

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

Konstanten

D3DSWAPEFFECT_DISCARD

Wenn eine Swapchain mit einem Swapeffekt von D3DSWAPEFFECT_FLIP oder D3DSWAPEFFECT_COPY erstellt wird, garantiert die Runtime, dass ein IDirect3DDevice9::P resent-Vorgang den Inhalt der Backpuffer nicht beeinflusst. Leider kann die Erfüllung dieser Garantie mit erheblichem Videospeicher- oder Verarbeitungsaufwand verbunden sein, insbesondere bei der Implementierung von Flip-Semantik für eine Fenster-Swapkette oder Kopiersemantik für eine Vollbild-Swapchain. Eine Anwendung kann den D3DSWAPEFFECT_DISCARD Tauscheffekt verwenden, um diese Mehrkosten zu vermeiden und dem Anzeigetreiber die Auswahl der effizientesten Präsentationstechnik für die Swapchain zu ermöglichen. Dies ist auch der einzige Auslagerungseffekt, der beim Angeben eines anderen Werts als D3DMULTISAMPLE_NONE für das MultiSampleType-Element von D3DPRESENT_PARAMETERS verwendet werden kann.

Wie bei einer Swap chain, die D3DSWAPEFFECT_FLIP verwendet, kann eine Swapkette, die D3DSWAPEFFECT_DISCARD verwendet, mehr als einen Backpuffer enthalten, auf die mithilfe von IDirect3DDevice9::GetBackBuffer oder IDirect3DSwapChain9:GetBackBuffer zugegriffen werden kann. Die Swap chain ist am besten als Warteschlange vorgesehen, in der 0 immer den Rückpuffer indiziert, der vom nächsten Present-Vorgang angezeigt wird und aus der Puffer verworfen werden, wenn sie angezeigt wurden.

Eine Anwendung, die diesen Auslagerungseffekt verwendet, kann keine Annahmen über den Inhalt eines verworfenen Backpuffers treffen und sollte daher einen gesamten Rückpuffer aktualisieren, bevor ein Present-Vorgang aufgerufen wird, der ihn anzeigt. Obwohl dies nicht erzwungen wird, überschreibt die Debugversion der Runtime den Inhalt verworfener Backpuffer mit zufälligen Daten, damit Entwickler überprüfen können, ob ihre Anwendungen die gesamten Hintergrundpufferoberflächen ordnungsgemäß aktualisieren.

D3DSWAPEFFECT_FLIP

Die Swap chain kann mehrere Backpuffer umfassen und sollte am besten als kreisförmige Warteschlange mit dem Frontpuffer verwendet werden. Innerhalb dieser Warteschlange werden die Backpuffer immer sequenziell von 0 bis (n - 1) nummeriert, wobei n die Anzahl der Backpuffer ist, sodass 0 den zuletzt am wenigsten angezeigten Puffer darstellt. Wenn Present aufgerufen wird, wird die Warteschlange "gedreht", sodass der Frontpuffer zum Backpuffer (n - 1) wird, während der Backpuffer 0 zum neuen Frontpuffer wird.

D3DSWAPEFFECT_COPY

Dieser Auslagerungseffekt kann nur für eine Swapchain angegeben werden, die einen einzelnen Backpuffer umfasst. Unabhängig davon, ob die Swapchain im Fenster oder im Vollbildmodus ausgeführt wird, garantiert die Laufzeit die Semantik eines kopierbasierten Present-Vorgangs, nämlich dass der Vorgang den Inhalt des Backpuffers unverändert lässt, anstatt ihn durch den Inhalt des Frontpuffers zu ersetzen, wie ein flipbasierter Present-Vorgang dies würde.

Für eine Vollbild-Swapkette verwendet die Runtime eine Kombination aus Flip- und Kopiervorgängen, die bei Bedarf von ausgeblendeten Puffern unterstützt werden, um den Present-Vorgang auszuführen. Dementsprechend wird die Präsentation mit dem vertikalen Retrace der Anzeigekarte synchronisiert und ihre Rate wird durch das ausgewählte Präsentationsintervall eingeschränkt. Eine Mit dem D3DPRESENT_INTERVAL_IMMEDIATE-Flag angegebene Swapchain ist die einzige Ausnahme. (Siehe Beschreibung des PresentationIntervals-Elements der D3DPRESENT_PARAMETERS-Struktur .) In diesem Fall kopiert ein Present-Vorgang den Inhalt des Backpuffers direkt in den Frontpuffer, ohne auf den vertikalen Rücklauf zu warten.

D3DSWAPEFFECT_OVERLAY

Verwenden Sie einen dedizierten Bereich mit Videospeicher, der auf der primären Oberfläche überlagert werden kann. Beim Anzeigen der Überlagerung wird keine Kopie ausgeführt. Der Überlagerungsvorgang wird auf Hardware ausgeführt, ohne die Daten auf der primären Oberfläche zu ändern.

Unterschiede zwischen Direct3D 9 und Direct3D 9Ex:

  • D3DSWAPEFFECT_OVERLAY ist nur in Direct3D9Ex unter Windows 7 (oder einem aktuelleren Betriebssystem) verfügbar.

D3DSWAPEFFECT_FLIPEX

Gibt an, wann eine Anwendung den Flip-Modus übernimmt, während der der Frame einer Anwendung übergeben wird, anstatt für die Komposition in den Desktopfenster-Manager (DWM) zu kopieren, wenn die Anwendung im Fenstermodus präsentiert wird. Im Flip-Modus kann eine Anwendung die Speicherbandbreite effizienter nutzen und eine Anwendung die Vorteile von Vollbildstatistiken nutzen. Der Flipmodus wirkt sich nicht auf das Vollbildverhalten aus.

Hinweis

Wenn Sie eine Swap chain mit D3DSWAPEFFECT_FLIPEX erstellen, können Sie den hDeviceWindow-Member der D3DPRESENT_PARAMETERS-Struktur nicht überschreiben, wenn Sie einen neuen Frame für die Anzeige präsentieren. Das heißt, Sie müssen NULL an den hDestWindowOverride-Parameter von IDirect3DDevice9Ex::P resentEx übergeben, um die Runtime anzuweisen, das hDeviceWindow-Element von D3DPRESENT_PARAMETERS für die Präsentation zu verwenden.

Unterschiede zwischen Direct3D 9 und Direct3D 9Ex:

  • D3DSWAPEFFECT_FLIPEX ist nur in Direct3D9Ex verfügbar, die unter Windows 7 (oder einem aktuelleren Betriebssystem) ausgeführt wird.

D3DSWAPEFFECT_FORCE_DWORD

Erzwingt, dass diese Enumeration in eine Größe von 32 Bits kompiliert wird. Ohne diesen Wert erlauben einige Compiler es dieser Enumeration, eine andere Größe als 32 Bits zu kompilieren. Dieser Wert wird nicht verwendet.

Bemerkungen

Der Zustand des Backpuffers nach einem Aufruf von Present ist durch jeden dieser Auslagerungseffekte genau definiert, und ob das Direct3D-Gerät mit einer Vollbild-Swapkette oder einer Fenster-Swapkette erstellt wurde, hat keine Auswirkungen auf diesen Zustand. Insbesondere funktioniert der D3DSWAPEFFECT_FLIP Swap-Effekt gleich, unabhängig davon, ob fenster- oder vollbildig, und die Direct3D-Runtime garantiert dies durch das Erstellen zusätzlicher Puffer. Daher wird empfohlen, dass Anwendungen nach Möglichkeit D3DSWAPEFFECT_DISCARD verwenden, um solche Strafen zu vermeiden. Dies liegt daran, dass dieser Auslagerungseffekt in Bezug auf Arbeitsspeicherverbrauch und Leistung immer der effizienteste ist.

Anwendungen, die D3DSWAPEFFECT_FLIP oder D3DSWAPEFFECT_DISCARD verwenden, sollten nicht erwarten, dass die Vollbild-Ziel alpha funktioniert. Dies bedeutet, dass der D3DRS_DESTBLEND Renderzustand nicht wie erwartet funktioniert, da Vollbild-Swapketten mit diesen Swapeffekten aus Sicht des Treibers kein explizites Pixelformat aufweisen. Der Treiber leitet ab, dass er das Anzeigeformat übernehmen soll, das keinen Alphakanal aufweist. Führen Sie die folgenden Schritte aus, um dies zu umgehen:

  • Verwenden Sie D3DSWAPEFFECT_COPY.
  • Überprüfen Sie das D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD-Flag im Caps3-Element der D3DCAPS9-Struktur . Dieses Flag gibt an, ob der Treiber Alphamischungen durchführen kann, wenn D3DSWAPEFFECT_FLIP oder D3DSWAPEFFECT_DISCARD verwendet wird.
  • Anwendungen, die den Auslagerungseffekt im Flipmodus (D3DSWAPEFFECT_FLIPEX) verwenden, sollten PresentEx aufrufen, nachdem eine Fenstergröße oder Region geändert wurde, um sicherzustellen, dass der Anzeigeinhalt aktualisiert wird.

Ein unsichtbares Fenster kann keine Ereignisse im Benutzermodus empfangen. Darüber hinaus beeinträchtigt ein unsichtbares Vollbildfenster die Darstellung des Fensters im Fenstermodus anderer Anwendungen. Daher muss jede Anwendung sicherstellen, dass ein Gerätefenster sichtbar ist, wenn eine Swapchain im Vollbildmodus angezeigt wird.

Anforderungen

Anforderung Wert
Header
D3D9Types.h

Siehe auch

Direct3D-Enumerationen

IDirect3DDevice9::Reset