Desktop window Manager(DWM,先前的DCE,桌面組合引擎)是窗口管理器的組件,在Window Vista中引入,其引進了Window Aero圖形用戶接口和可視的主題。DWM要求圖形卡支持DirectX9.0和Shader模式2.0.DWM在Vista Starter版本中沒有,只有Vista Home基礎(chǔ)版中有,但許多Window Aero接口(例如Glass和Flip 3D)都無效。在Windows Server 2008中也可以,但桌面體驗特性和兼容的圖形驅(qū)動程序是必須的。
架構(gòu)
使用DWM,應(yīng)用程序并不直接地畫到顯存中,取而代之的行為是將內(nèi)容畫到系統(tǒng)內(nèi)存的off屏幕緩沖區(qū),這個緩沖區(qū)又DWM組合到一起而最終渲染到屏幕上,每秒許多次。某種意義上說,他與Mac OS X的Quartz Compositor相似。因為Compositor已經(jīng)訪問所有程序的圖形。DWM使用Direct 9X來執(zhí)行組合功能并最終在GPU中render,將CPU從Screen Buffer到顯示器的渲染過程解脫出來。然而這并不映像應(yīng)用程序paint到off屏幕緩沖區(qū),依賴于使用什么樣的技術(shù),可能仍然是CPU綁定的。DWM結(jié)構(gòu)在DWM兼容格式中可用。緩沖區(qū)中的窗口內(nèi)容轉(zhuǎn)換到DirectX 素材。
桌面本身是滿屏的Direct3D表面,其窗口使用兩個相鄰三角形表達的網(wǎng)格可以變換到2D的矩形。素材,代表UI映射到這些矩形上。窗口轉(zhuǎn)換實現(xiàn)為網(wǎng)格轉(zhuǎn)換,使用shader程序。Windows Vista,轉(zhuǎn)換限制在實現(xiàn)轉(zhuǎn)換的內(nèi)建陰影中。 DWM僅僅將主桌面對象映射到一個3D表面,其他的桌面對象,包括虛擬桌面和UAC使用或不適用的安全桌面。
由于所有的應(yīng)用程序都render到一個off-screen緩沖區(qū),他們也可以同樣讀取嵌入到其他程序的緩沖區(qū)。由于off-screen緩沖區(qū)是有應(yīng)程序經(jīng)常更新,嵌入的rendering將是應(yīng)用程序窗口的動態(tài)表達而不是靜態(tài)的rendering。這就是live thumbnail 預(yù)覽,Windows Flip和Window Flip3D在Windows Vista如何工作的。 DWM使用MIL(媒體集成層,未托管的compositor,和WPF一道共享)來將窗口表達為在一個composition樹上的一個composition節(jié)點,表示桌面和所有在里面的窗口,這些通過MIL從場景后到前render。由于所有的窗口對最終的圖象都有貢獻,因此復(fù)合像素的顏色由多個窗口決定,這用來實現(xiàn)透明度的效果。DWM允許自定義陰影來控制怎么樣將多個應(yīng)用程序創(chuàng)建符合像素。DWM包括內(nèi)建的Pixel shader2.0程序,其計算窗口中像素的顏色,其平均臨近和后面窗口中的像素值。這些引用被DWM用來在DWM管理的窗口邊界獲得blur效果。
由于MIL通過composition樹來提供一個retained mode圖象系統(tǒng),在窗口被移動時需要repaint和refresh的工作就由DWM和MIL處理,將應(yīng)用程序從其free出來。已經(jīng)在composition樹和off-screen緩沖區(qū)中的背景數(shù)據(jù),直接用來render背景, 而不用讓背景應(yīng)用程序通過發(fā)送WM_PAINT來重繪它們自己,就象Vista之前系統(tǒng)所做的一樣。DWM使用雙緩沖區(qū),避免在移動窗口的時候閃爍或抖動,composition引擎使用例如挑選的優(yōu)化辦法來提高性能,避免重畫沒有變化的部分。由于compositor是多監(jiān)視器感知的,DWM天生支持這些。在滿屏應(yīng)用程序中,例如游戲,DWM并不執(zhí)行窗口組合而因此性能并沒有相當大的降低。
重定向
對于非DWM感知的rendering技術(shù),輸出必須被重定向到DWM緩沖區(qū)。對于窗口,GDI或DirectX任何一個都可以用來rendering。為了讓這兩個能與DWM一起工作,DWM為其提供了重定向技術(shù)。
對于GDI,Microsoft Windows中最常用的rendering技術(shù),每個應(yīng)用程序窗口在其部分或全部需要顯示的時候,都是應(yīng)用程序的工作去rendering它們自己。如果沒有DWM,rendering在視頻內(nèi)存緩沖區(qū)中掃描。在DWM下,系統(tǒng)內(nèi)存中分配一個與窗口大小相等的緩沖區(qū)。GDI調(diào)用被重定向到去寫這些緩沖區(qū),而不是直接到視頻內(nèi)存。另外一個緩沖區(qū)在video內(nèi)存中分配來表示DirectX表面,其作為窗口網(wǎng)格的素材。系統(tǒng)內(nèi)存緩沖區(qū)分別被轉(zhuǎn)換到DirextX表面,并且同步進行。這個過程是必須的,由于GDI不能直接輸出DirextX像素格式。表面由compositor和來讀,并且組合到視頻內(nèi)存的桌面中。寫GDI輸出到系統(tǒng)內(nèi)存不是硬件減速的,也不是轉(zhuǎn)換到DirextX表面。當一個GDI窗口被最小化的,其通過GDI的限制,緩沖區(qū)不再更新。因此,DWM使用應(yīng)用程序被最小化之前的最后一幅位圖來render緩沖區(qū)。
對于使用DirextX來寫3D表面的應(yīng)用程序,Windows Vista中實現(xiàn)的DirextX使用WDDM來與DWM共享表面。DWM然后直接使用表面并且與窗口網(wǎng)格映射。對于WPF程序,這些是DirextX程序,compositorrender這些共享的表面,其被組合到最終的桌面。應(yīng)用程序能混合多child窗口的renderng技術(shù),只要GDI和DirextX都被用來render相同的窗口。這種情況,DirextX和 GDI的rendering的順序不能保證,并且例如不能保證來自系統(tǒng)內(nèi)存的GDI位圖是否應(yīng)經(jīng)被傳遞到視頻內(nèi)存表面。因此,最終的組合可能沒有包含GDIrendered元素。為了阻止這個發(fā)生,DWM被臨時關(guān)閉,只要應(yīng)用程序是在同一個窗口混合運行GDI和DirextX。