Flipping Surfaces (Direct3D 9)

Eine Direct3D-Anwendung zeigt in der Regel eine animierte Sequenz an, indem sie die Frames der Animation in Hintergrundpuffern generiert und nacheinander darstellt. Zurückpuffer sind in Swapchains organisiert. Eine Swapchain ist eine 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 drehen, wenn das Rendering abgeschlossen ist. Dadurch wird das als Tearing bekannte Phänomen vermieden und eine flüssigere Animation ermöglicht.

Jedes in Direct3D erstellte Gerät verfügt über mindestens eine Swapchain. Wenn Sie das erste Direct3D-Gerät initialisieren, legen Sie den BackBufferCount-Member von D3DPRESENT_PARAMETERS fest, der Direct3D die Anzahl der Backpuffer angibt, die sich in der Swapchain befinden werden. Der Aufruf von IDirect3D9::CreateDevice erstellt dann das Direct3D-Gerät und die entsprechende Swapchain.

Wenn Sie IDirect3DDevice9::P resent verwenden, um einen Surface-Flip-Vorgang anzufordern, werden die Zeiger auf den Oberflächenspeicher für den Frontpuffer und den Backpuffer ausgetauscht. Das Flipping erfolgt durch Umschalten von Zeigern, die das Anzeigegerät zum Verweisen auf den Speicher verwendet, und nicht durch Kopieren des Oberflächenspeichers. Wenn eine umklappende Kette einen Vorderpuffer und mehr als einen Rückpuffer enthält, werden die Zeiger wie im folgenden Diagramm dargestellt in einem kreisförmigen Muster umgeschaltet.

Diagramm einer Flipping-Kette mit einem Frontpuffer und zwei Hintergrundpuffern

Sie können zusätzliche Swapchains für ein Gerät erstellen, indem Sie IDirect3DDevice9::CreateAdditionalSwapChain aufrufen. Eine Anwendung kann eine Swapchain pro Ansicht erstellen und jede Swapchain einem bestimmten Fenster zuordnen. Die Anwendung rendert Bilder in den Hintergrundpuffern jeder Swapchain und stellt sie dann einzeln dar. Die beiden Parameter, die IDirect3DDevice9::CreateAdditionalSwapChain verwendet, sind ein Zeiger auf eine D3DPRESENT_PARAMETERS-Struktur und die Adresse eines Zeigers auf eine IDirect3DSwapChain9-Schnittstelle . Sie können dann IDirect3DSwapChain9::P resent verwenden, um den Inhalt des nächsten Backpuffers dem Frontpuffer anzuzeigen. Beachten Sie, dass ein Gerät nur über eine Vollbild-Swapchain verfügen kann.

Sie können Zugriff auf einen bestimmten Rückpuffer erhalten, indem Sie die Methoden IDirect3DDevice9::GetBackBuffer oder IDirect3DSwapChain9::GetBackBuffer aufrufen, die einen Zeiger auf eine IDirect3DSurface9-Schnittstelle zurückgeben, die die zurückgegebene Zurückpufferoberfläche darstellt. Beachten Sie, dass durch den Aufruf 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 ein Speicherverlust auftreten.

Denken Sie daran, dass Direct3D Oberflächen umdreht, indem Surface-Speicherzeiger innerhalb der Swapchain ausgetauscht werden, nicht indem die Oberflächen selbst ausgetauscht werden. Dies bedeutet, dass Sie immer im Hintergrundpuffer rendern, der als Nächstes angezeigt wird.

Es ist wichtig, die Unterscheidung zwischen einem "Flipping-Vorgang", wie er von einem Grafikkartentreiber ausgeführt wird, und einem "Present"-Vorgang zu beachten, der auf eine mit D3DSWAPEFFECT_FLIP erstellte Swapchain angewendet wird.

Der Begriff "Flip" bezeichnet konventionell einen Vorgang, der den Bereich der Videospeicheradressen ändert, den ein Grafikkarte zum Generieren seines Ausgabesignals verwendet, wodurch der Inhalt eines zuvor ausgeblendeten Hintergrundpuffers angezeigt wird. In Direct3D 9 wird der Begriff häufig allgemeiner verwendet, um die Darstellung eines Rückpuffers in jeder Swapchain zu beschreiben, die mit dem D3DSWAPEFFECT_FLIP Swapeffekt erstellt wurde.

Während solche "Present"-Vorgänge fast immer durch Flip-Vorgänge implementiert werden, wenn es sich bei der Swapchain um eine Vollbildkette handelt, werden sie notwendigerweise durch Kopiervorgänge implementiert, wenn die Swapchain ein Fenster ist. Darüber hinaus kann ein Grafikkartentreiber flipping verwenden, um Present-Vorgänge für Vollbild-Swapchains basierend auf den D3DSWAPEFFECT_DISCARD und D3DSWAPEFFECT_COPY zu implementieren.

Die obige Diskussion bezieht sich auf den häufig verwendeten Fall einer Vollbild-Swapchain, die mit D3DSWAPEFFECT_FLIP erstellt wurde.

Eine allgemeinere Erläuterung der verschiedenen Swap-Effekte für Fenster- und Vollbild-Swapchains finden Sie unter D3DSWAPEFFECT.

Direct3D-Oberflächen