Spiegelnde Oberflächen (Direct3D 9)
Eine Direct3D-Anwendung zeigt in der Regel eine animierte Sequenz an, indem die Frames der Animation in Hintergrundpuffern generiert und nacheinander präsentiert werden. Hintergrundpuffer sind in Swapketten organisiert. Eine Swapkette besteht aus einer Reihe von Puffern, die nacheinander auf den Bildschirm "kippen". Dies kann verwendet werden, um eine Szene im Arbeitsspeicher zu rendern und die Szene dann auf den Bildschirm zu kippen, wenn das Rendering abgeschlossen ist. Dies vermeidet das als "Reißer" bezeichnete - Und ermöglicht eine reibungslosere Animation.
Jedes in Direct3D erstellte Gerät verfügt über mindestens eine Austauschkette. Wenn Sie das erste Direct3D-Gerät initialisieren, legen Sie das BackBufferCount-Member von D3DPRESENT _ PARAMETERSfest, das Direct3D die Anzahl der Backpuffer in der Auslagerungskette anordnt. Der Aufruf von IDirect3D9::CreateDevice erstellt dann das Direct3D-Gerät und die entsprechende Austauschkette.
Wenn Sie IDirect3DDevice9::P resent zum Anfordern eines Oberflächen-Flip-Vorgangs verwenden, werden die Zeiger auf den Oberflächenspeicher für den Frontpuffer und die Hintergrundpuffer ausgetauscht. Das Umschalten erfolgt durch Wechseln von Zeigern, die das Anzeigegerät zum Verweisen auf den Arbeitsspeicher verwendet, und nicht durch Kopieren des Oberflächenspeichers. Wenn eine Kippkette einen Frontpuffer und mehr als einen Hintergrundpuffer enthält, werden die Zeiger in einem kreisförmigen Muster umgeschaltet, wie im folgenden Diagramm dargestellt.

Sie können zusätzliche Austauschketten für ein Gerät erstellen, indem Sie IDirect3DDevice9::CreateAdditionalSwapChain aufrufen. Eine Anwendung kann eine Swapkette pro Ansicht erstellen und jede Austauschkette einem bestimmten Fenster zuordnen. Die Anwendung rendert Bilder in den Hintergrundpuffern jeder Austauschkette und stellt sie dann einzeln vor. Die beiden Parameter, die IDirect3DDevice9::CreateAdditionalSwapChain verwendet, sind ein Zeiger auf eine D3DPRESENT _ PARAMETERS-Struktur und die Adresse eines Zeigers auf eine IDirect3DSwapChain9-Schnittstelle. Anschließend können Sie IDirect3DSwapChain9::P resent verwenden, um den Inhalt des nächsten Hintergrundpuffers im Frontpuffer anzuzeigen. Beachten Sie, dass ein Gerät nur über eine Auslagerungskette im Vollbildmodus verfügen kann.
Sie können Zugriff auf einen bestimmten Hintergrundpuffer erhalten, indem Sie die Methoden IDirect3DDevice9::GetBackBuffer oder IDirect3DSwapChain9::GetBackBuffer aufrufen, die einen Zeiger auf eine IDirect3DSurface9-Schnittstelle zurückgeben, die die zurückgegebene Pufferoberfläche darstellt. Beachten Sie, dass durch das Aufrufen dieser Methode die interne Verweisanzahl auf der IDirect3DDevice9-Schnittstelle erhöht wird. Rufen Sie daher IUnknown auf, wenn Sie diese Oberfläche nicht mehr verwenden, oder es kommt zu einem Arbeitsspeicherverlust.
Denken Sie daran, dass Direct3D Oberflächen kippt, indem Oberflächenspeicherzeige innerhalb der Austauschkette ausgetauscht werden, nicht indem die Oberflächen selbst ausgetauscht werden. Dies bedeutet, dass Sie immer in den Hintergrundpuffer rendern, der als Nächstes angezeigt wird.
Es ist wichtig, den Unterschied zwischen einem "Kippvorgang", der von einem Adaptertreiber ausgeführt wird, und einem "Present"-Vorgang zu beachten, der auf eine Mit D3DSWAPEFFECT FLIP erstellte Swapkette angewendet _ wird.
Der Begriff "Flip" bezeichnet konventionell einen Vorgang, der den Bereich der Videospeicheradressen ändert, die ein Adapter zum Generieren seines Ausgabesignals verwendet, wodurch der Inhalt eines zuvor ausgeblendeten Hintergrundpuffers angezeigt wird. In Direct3D 9 wird der Begriff häufig allgemein verwendet, um die Darstellung eines Hintergrundpuffers in jeder Swapkette zu beschreiben, die mit dem D3DSWAPEFFECT FLIP Swap-Effekt _ erstellt wurde.
Obwohl solche "Present"-Vorgänge fast aussergeänderlich durch Flip-Vorgänge implementiert werden, wenn es sich bei der Swapkette um eine Vollbildkette handelt, werden sie notwendigerweise durch Kopiervorgänge implementiert, wenn die Auslagerungskette über ein Fenster geöffnet wird. Darüber hinaus kann ein Adaptertreiber flipping verwenden, um Present-Vorgänge für Vollbild-Auslagerungsketten basierend auf D3DSWAPEFFECT DISCARD und _ D3DSWAPEFFECT _ COPY zu implementieren.
Die obige Erörterung gilt für den häufig verwendeten Fall einer Vollbild-Swapkette, die mit D3DSWAPEFFECT _ FLIP erstellt wurde.
Eine allgemeinere Erörterung der verschiedenen Swapeffekte für Fenster- und Vollbild-Swapketten finden Sie unter D3DSWAPEFFECT.