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