D3DSWAPEFFECT 列舉

定義交換效果。

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;

常數

D3DSWAPEFFECT_DISCARD

當交換鏈結以D3DSWAPEFFECT_FLIP或D3DSWAPEFFECT_COPY的交換效果建立時,執行時間會保證 IDirect3DDevice9::P resent 作業不會影響任何後端緩衝區的內容。 可惜的是,達到此保證可能會牽涉到大量的視訊記憶體或處理額外負荷,特別是針對視窗交換鏈結實作翻轉語意,或針對全螢幕交換鏈結實作複製語意時。 應用程式可以使用D3DSWAPEFFECT_DISCARD交換效果來避免這些額外負荷,並讓顯示驅動程式為交換鏈結選取最有效率的呈現技術。 這也是指定 D3DPRESENT_PARAMETERS MultiSampleType 成員D3DMULTISAMPLE_NONE以外的值時,唯一 可使用的交換效果。

就像使用D3DSWAPEFFECT_FLIP的交換鏈結一樣,使用D3DSWAPEFFECT_DISCARD的交換鏈結可能包含多個背景緩衝區,其中任何一個都可以使用 IDirect3DDevice9::GetBackBufferIDirect3DSwapChain9::GetBackBuffer來存取。 交換鏈結最適合作為佇列,其中 0 一律會為下一個 Present 作業所顯示的背景緩衝區編制索引,並在顯示緩衝區時捨棄這些緩衝區。

使用此交換效果的應用程式無法對捨棄的背景緩衝區內容進行任何假設,因此應該在叫用會顯示它的 Present 作業之前更新整個背景緩衝區。 雖然不會強制執行,但執行時間的偵錯版本會以亂數據覆寫捨棄的背景緩衝區內容,讓開發人員確認其應用程式已正確更新整個後端緩衝區表面。

D3DSWAPEFFECT_FLIP

交換鏈結可能包含多個背景緩衝區,而且最適合作為包含前端緩衝區的迴圈佇列。 在此佇列中,後端緩衝區一律會循序從 0 編號到 (n - 1) ,其中 n 是背景緩衝區的數目,因此 0 表示最近呈現的緩衝區。 叫用 Present 時,佇列會「輪替」,讓前端緩衝區變成後端緩衝區 (n - 1) ,而後端緩衝區 0 會變成新的前端緩衝區。

D3DSWAPEFFECT_COPY

這個交換效果只能針對包含單一背景緩衝區的交換鏈結指定。 不論交換鏈結是視窗化還是全螢幕,執行時間都會保證以複製為基礎的 Present 作業所隱含的語意,也就是作業會將背景緩衝區的內容保持不變,而不是將它取代為以翻轉為基礎的 Present 作業。

針對全螢幕交換鏈結,執行時間會使用翻轉作業和複製作業的組合,並視需要由隱藏的背景緩衝區支援,以完成 Present 作業。 因此,簡報會與顯示器配接器的垂直回溯同步處理,而且其速率受限於所選的簡報間隔。 以 D3DPRESENT_INTERVAL_IMMEDIATE 旗標指定的交換鏈結是唯一的例外狀況。 (請參閱D3DPRESENT_PARAMETERS structure.) PresentationIntervals成員的描述 在此案例中,Present 作業會將背景緩衝區內容直接複製到前端緩衝區,而不需等候垂直回溯。

D3DSWAPEFFECT_OVERLAY

使用可在主要介面上重迭的專用視訊記憶體區域。 顯示重迭時,不會執行任何複製。 重迭作業會在硬體中執行,而不需修改主要介面中的資料。

Direct3D 9 與 Direct3D 9Ex 之間的差異:

  • D3DSWAPEFFECT_OVERLAY僅適用于在 Windows 7 上執行的 Direct3D9Ex (或更多目前的作業系統) 。

D3DSWAPEFFECT_FLIPEX

指定當應用程式採用翻轉模式時,應用程式框架在何時傳遞,而不是複製到桌面視窗管理員, (DWM) 在應用程式以視窗模式呈現時進行組合。 翻轉模式可讓應用程式更有效率地使用記憶體頻寬,以及讓應用程式利用全螢幕呈現統計資料。 翻轉模式不會影響全螢幕行為。

注意

如果您使用 D3DSWAPEFFECT_FLIPEX 建立交換鏈結,當您呈現要顯示的新框架時,就無法覆寫D3DPRESENT_PARAMETERS結構的hDeviceWindow成員。 也就是說,您必須將Null傳遞給IDirect3DDevice9Ex::P resentExhDestWindowOverride參數,以指示執行時間針對簡報使用D3DPRESENT_PARAMETERShDeviceWindow成員。

Direct3D 9 與 Direct3D 9Ex 之間的差異:

  • D3DSWAPEFFECT_FLIPEX僅適用于在 Windows 7 (或更新作業系統) 上執行的 Direct3D9Ex。

D3DSWAPEFFECT_FORCE_DWORD

強制此列舉的大小編譯為 32 位。 如果沒有這個值,某些編譯器會允許此列舉編譯成 32 位以外的大小。 不使用這個值。

備註

呼叫 Present 之後的背景緩衝區狀態是由這些交換效果所妥善定義,而且 Direct3D 裝置是使用全螢幕交換鏈結建立,還是視窗交換鏈結對這個狀態沒有任何影響。 特別是,D3DSWAPEFFECT_FLIP交換效果的運作方式與視窗化或全螢幕相同,而 Direct3D 執行時間會藉由建立額外的緩衝區來保證這一點。 因此,建議應用程式盡可能使用 D3DSWAPEFFECT_DISCARD,以避免任何這類懲罰。 這是因為此交換效果在記憶體耗用量和效能方面一律最有效率。

使用D3DSWAPEFFECT_FLIP或D3DSWAPEFFECT_DISCARD的應用程式不應預期全螢幕目的地 Alpha 能夠運作。 這表示D3DRS_DESTBLEND轉譯狀態無法如預期般運作,因為具有這些交換效果的全螢幕交換鏈結沒有驅動程式觀點的明確像素格式。 驅動程式推斷它們應該採用沒有 Alpha 色板的顯示格式。 若要解決此問題,請採取下列步驟:

  • 使用D3DSWAPEFFECT_COPY。
  • 檢查 D3DCAPS9 結構的 Caps3 成員中的D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD旗標。 此旗標指出在使用D3DSWAPEFFECT_FLIP或D3DSWAPEFFECT_DISCARD時,驅動程式是否可以進行 Alpha 混合。
  • 使用翻轉模式交換效果的應用程式 (D3DSWAPEFFECT_FLIPEX) 應該在視窗調整大小或區域變更之後呼叫 PresentEx ,以確保顯示內容已更新。

不可見的視窗無法接收使用者模式事件;此外,不可見的全螢幕視窗會干擾另一個應用程式的視窗強制回應視窗呈現。 因此,當交換鏈以全螢幕模式呈現時,每個應用程式都必須確保裝置視窗可見。

規格需求

需求
標頭
D3D9Types.h

另請參閱

Direct3D 列舉

IDirect3DDevice9::Reset