翻轉 Surface (Direct3D 9)

Direct3D 應用程式通常會藉由在背景緩衝區中產生動畫的畫面格,並依序呈現動畫來顯示動畫序列。 後端緩衝區會組織成交換鏈結。 交換鏈結是一系列緩衝區,可「逐一翻轉」到畫面。 這可用來在記憶體中轉譯一個場景,然後在轉譯完成時將場景翻轉至畫面。 這可避免所謂的卸載現象,並允許更順暢的動畫。

在 Direct3D 中建立的每個裝置至少有一個交換鏈結。 當您初始化第一個 Direct3D 裝置時,您會設定 D3DPRESENT_PARAMETERS的 BackBufferCount 成員,這會告知 Direct3D 將位於交換鏈結中的後端緩衝區數目。 呼叫 IDirect3D9::CreateDevice ,然後建立 Direct3D 裝置和對應的交換鏈結。

當您使用 IDirect3DDevice9::P resent 要求表面翻轉作業時,會交換前端緩衝區和後端緩衝區的介面記憶體指標。 翻轉是透過切換顯示裝置用於參考記憶體的指標來執行,而不是複製表面記憶體。 當翻轉鏈結包含前端緩衝區和多個後端緩衝區時,指標會以圓形模式切換,如下圖所示。

具有前端緩衝區和兩個後端緩衝區的翻轉鏈結圖表

您可以呼叫 IDirect3DDevice9::CreateAdditionalSwapChain來建立裝置的新增交換鏈結。 應用程式可以為每個檢視建立一個交換鏈結,並將每個交換鏈結與特定視窗產生關聯。 應用程式會在每個交換鏈結的後端緩衝區中轉譯影像,然後個別呈現影像。 IDirect3DDevice9::CreateAdditionalSwapChain採用的兩個參數是D3DPRESENT_PARAMETERS結構的指標,以及IDirect3DSwapChain9介面的指標位址。 然後,您可以使用 IDirect3DSwapChain9::P resent ,將下一個背景緩衝區的內容顯示到前端緩衝區。 請注意,裝置只能有一個全螢幕交換鏈結。

您可以藉由呼叫 IDirect3DDevice9::GetBackBufferIDirect3DSwapChain9::GetBackBuffer 方法,以取得特定後端緩衝區的存取權,這個方法會傳回代表傳回後端緩衝區介面的 IDirect3DSurface9 介面指標。 請注意,呼叫這個方法會增加 IDirect3DDevice9 介面上的內部參考計數,因此當您完成使用此介面或記憶體流失時,請務必呼叫 IUnknown

請記住,Direct3D 會交換交換鏈結內的介面記憶體指標來翻轉表面,而不是交換介面本身。 這表示您一律會轉譯為下一個顯示的後端緩衝區。

請務必注意顯示配接器驅動程式所執行的「翻轉作業」,以及套用至使用 D3DSWAPEFFECT_FLIP 建立之交換鏈結的「呈現」作業之間的差異。

「翻轉」一詞傳統上表示會改變顯示配接器用來產生輸出訊號之視訊記憶體位址範圍的作業,因而導致顯示先前隱藏的背景緩衝區內容。 在 Direct3D 9 中,一詞通常用來描述使用D3DSWAPEFFECT_FLIP交換效果所建立之任何交換鏈結中的後端緩衝區呈現方式。

雖然當交換鏈結是全螢幕作業時,這類「存在」作業幾乎不一定由翻轉作業實作,但當交換鏈結視窗化時,這些作業一定會由複製作業實作。 此外,顯示器配接器驅動程式也可以使用翻轉,根據D3DSWAPEFFECT_DISCARD和D3DSWAPEFFECT_COPY,針對全螢幕交換鏈結實作 Present 作業。

上述討論適用于使用 D3DSWAPEFFECT_FLIP 所建立全螢幕交換鏈結的常用案例。

如需視窗化和全螢幕交換鏈結之不同交換效果的更一般討論,請參閱 D3DSWAPEFFECT

Direct3D 表面