注意
針對 Windows 10 上的應用程式,我們建議使用 Windows.UI.Composition API,而不是 DirectComposition。 如需詳細資訊,請參閱 使用視覺層將傳統型應用程式現代化。
本主題描述 DirectComposition 支援Microsoft介面的類型。
DirectComposition 邏輯介面
DirectComposition 會公開 IDCompositionSurface 物件來表示邏輯組合介面。 DirectComposition 會公開可用來建立、更新和刪除這些邏輯介面的 API。 每個介面都可以與一或多個視覺效果相關聯。 應用程式負責管理邏輯介面的存留期。
更新邏輯介面
應用程式可以呼叫 BeginDraw,並在應用程式想要更新的邏輯介面上指定矩形的大小和位移,以更新邏輯介面。 DirectComposition 會配置指定大小的矩形,然後傳回介面和應用程式需要繪製或更新的對應位移。 更新矩形的限制是由表面大小所系結。 例如,40 x 100 像素表面的更新矩形最多可達 (0,0,40,100)。 此外,可更新的區域是由防護矩形強制執行。 因為一次只能有一個防護矩形,一次只能更新一個邏輯介面。 BeginDraw如果在先前 呼叫 BeginDraw之後尚未呼叫 EndDraw 或 SuspendDraw,就會傳回錯誤碼。 應用程式可以將認可呼叫新增至 batch BeginDraw,但在呼叫和認可 EndDraw 之前,它才會生效。
暫停邏輯介面的更新
需要更新不同介面的應用程式可以在目前的更新上呼叫 suspendDraw,然後呼叫 BeginDraw 以開始新的更新。 Microsoft DirectComposition 允許多個更新,但一次只能使用一個。 這表示您需要呼叫 SuspendDraw 或 EndDraw,再呼叫下一個介面上的 beginDraw 。 不同於 EndDraw,認可的批次可以包含處於 SuspendDraw 狀態的介面,但在 呼叫 EndDraw 之前,將不會在螢幕上顯示這類更新。
繼續邏輯介面的更新
應用程式可以呼叫 resumeDrawResumeDraw,以繼續更新處於SuspendDraw 狀態的介面。 這個方法只能在暫止表面呼叫。
結束邏輯介面的更新
呼叫 EndDraw 和 Commit 是唯一在畫面上查看位圖更新變更的方法。 每個呼叫 EndDraw 都必須有對應的呼叫,才能移除防護矩形 BeginDraw。 邏輯介面會保留所有更新,直到呼叫 認可 為止。 您也可以在處於 SuspendDraw狀態的介面上呼叫EndDraw,因為 EndDraw 是隱含的繼續/結束。 呼叫 EndDraw之後,更新的內容會顯示到畫面並捨棄,以便更新的記憶體可以重複使用以供稍後更新使用。
使用邏輯介面的範例
下列範例說明如果應用程式建立包含兩個視覺效果的可視化樹狀結構,然後需要更新與視覺效果相關聯之兩個邏輯介面的特定區域時,應用程式會採取的步驟:
- 建立 DirectComposition 裝置。
- 建立包含根節點和視覺效果 1 和 2 的可視化樹狀結構。
- 建立邏輯介面 1 和 2。
- 呼叫 SetContent,將邏輯介面與視覺效果 1 和 2 產生關聯。
- 在邏輯介面 1 的子矩形上呼叫 BeginDraw。
- 更新 DirectComposition 所傳回位移處的介面。
- 選擇性步驟:
- 在邏輯介面 1 上呼叫 SuspendDraw。
- 在邏輯介面 2 的子矩形上呼叫 BeginDraw。
- 更新 DirectComposition 所傳回位移處的介面。
- 在邏輯介面 2 上呼叫 EndDraw。
- 在邏輯介面 1 上呼叫 ResumeDraw。
- 更新 DirectComposition 所傳回位移處的介面。
- 在邏輯介面 1 上呼叫 EndDraw。
- 呼叫認可 。
DirectComposition 虛擬表面
DirectComposition 會公開 IDCompositionVirtualSurface 介面來表示虛擬表面,這是以固定大小的磚排列在固定網格線中排列的邏輯介面 (tiles) 集合。 應用程式會在建立時指定虛擬紋理的大小。 大小會建立虛擬表面的界限。 介面可以與一或多個視覺效果相關聯。
當虛擬介面初始化時,它不會受到實際配置的支援。 換句話說,它不會保存任何位。 DirectComposition 會在應用程式開始更新介面之後配置磚(也就是組合介面物件)。 應用程式會呼叫 beginDraw ,並指定虛擬表面座標相關的區域,以更新虛擬表面。 然後,DirectComposition 會配置必要的磚來保存更新,並傳回要更新的組合介面和位移。
如同邏輯介面,您可以在虛擬介面上呼叫 BeginDraw、SuspendDraw、ResumeDraw 和 EndDraw。 此外,DirectComposition 會公開可用來調整和修剪現有虛擬表面的方法。
調整虛擬表面的大小
Resize 方法會變更虛擬表面的界限,這表示任何新的更新或配置都必須落在新大小所設定的界限中。 應用程式會使用 Resize,告訴 DirectComposition 不再需要虛擬表面的特定區域,而且可以回收。 如果 重設大小 縮小虛擬表面,應用程式就無法再更新新界限以外的區域。
下圖顯示大小為 2-by-2 的 3-by-3 虛擬表面。 紅色區域代表在重設大小作業中捨棄的磚,而 DirectComposition 會回收記憶體。 重設大小之後,應用程式無法對紅色區域進行更新,而不需要重新調整虛擬表面的大小。
重設大小作業會立即生效。 DirectComposition 不會等待應用程式呼叫 Commit,以進行重設大小更新。 例如,假設應用程式進行下列一連串的呼叫。
pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();
在此範例中,應用程式會在第一次重設大小時遺失所有內容。 第二個重設大小沒有任何作用,即使已在認可 之前呼叫它,。 在此情況下,畫面上不會顯示任何內容。
修剪虛擬表面
Trim 方法會識別應用程式所需的虛擬表面區域。 它不會調整虛擬介面的界限,但會告訴 DirectComposition 目前需要配置的邏輯介面。
在下圖中,綠色方塊是應用程式的檢視區。 應用程式一開始會轉譯為檢視區中虛擬表面前六個磚(藍色)。 當虛擬表面捲動所代表的頁面時,應用程式必須轉譯最後六個磚。 應用程式會呼叫 Trim,指出最後六個磚所定義的區域是內容所在位置,而目前不需要其餘部分。 DirectComposition 接著可以選擇回收原本代表前六個磚的邏輯表面(深灰色)。
相關主題