桌面視窗管理器

桌面視窗管理器

桌面視窗管理器是Vista中的一個新組件:Desktop Window Manager(DWM)。它建立在WPF核心圖形層組件基礎之上。DWM的桌面合成是建立在Composition引擎基礎之上的新特徵。它的出現幾乎改變了Vista中應用程式的螢幕象素顯示方式。啟用DWM後,提供的視覺效果有毛玻璃框架、3D視窗變換動畫、視窗翻轉和高解析度支持。其中最明顯的特徵有:系統列視窗的實時縮略圖;Alt-Tab和Win-Tab組合鍵所看到的效果。

基本信息

簡介

通過DWM的桌面合成

應用程式的顯示不再是直接畫到螢幕上,而是一個顯示記憶體中的一個離屏Surface。然後由DWM將這些Surface合成顯示到螢幕之上。

桌面合成(Composition)

在Vista之前,Windows要求應用程式畫自己的可見區域,它們可以直接畫在顯示卡的視頻緩衝裡面。而在Vista,系統要求應用程式把整個表面畫到離屏Surface當中。然後由DWM控制所有的離屏表面,並把它們合成到一起顯示到真正的螢幕上。

現在計算機的圖形晶片飛速發展,具有了很強的處理能力,現在它們主要用於遊戲等方面。DWM的主要目標就是利用圖形晶片的處理能力也給非遊戲用戶帶來儘可能好的體驗。因此DWM是基於DirectX,特別是Direct3D。更準備是說,DWM是直接建立在一個稱為Milcore的層次之上。Milcore又建立在DirectX之上。最終是用Direct3D紋理來表示視窗內容和視窗框架。DWM/Milcore調用適當的Direct3D函式把所有的Direct3D紋理合成為最終的桌面。Vista或Win7桌面就可以理解為一個全螢幕幕的Direct3D應用程式。

優點

帶來的便利

從視窗系統的顯示角度上看,這可以給我們帶來很大的方便,幫助實現更高質量的視覺效果,比如:

1、訪問視窗:現在所有的視窗都顯示到離屏表面,這些離屏表面就可以用於其他的地方了。例如前面提到的Alt-Tab組合鍵所看到的縮略圖,用戶還可以據此實現一些其他需求。

2、視窗操作中不再涉及到背景應用程式:在Vista之前,如果隱藏的視窗變得重新可見,這部分區域只有在應用程式醒來後並回響了WM_PAINT才能被重畫,這就引起了很多難看的效果。在Vista中,背景視窗不會收到WM_PAINT,也不會被要求提交,因為他們的內容已經在離屏表面當中了,可以被直接拿來進行重新合成。

3、更炫的用戶體驗,這個不用多說了,大家可以有自己的體驗感受。

4、高解析度支持:大部分應用程式不知道它所運行的顯示器的解析度。隨著高解析度顯示器的普及,這會使應用程式在物理空間看起來越來越小,效果很差。由於DWM訪問了視窗的離屏表面,其特殊的位置可以調整應用程式的顯示解析度,使它在高解析度顯示器上有更好的效果。

在DWM中,我們的每個視窗都用一個Surface表示,都可以看到為是3D的格線。雖然每個視窗還是一個矩形,但它們都位於一個3D空間之中。視窗的操作,比如最大化,還原等等,都發生了變化,它們都是對格線進行3D變換實現的。與以往有了很大的區別。

在Windows Vista或Windows7中視窗的毛玻璃效果非常絢麗。在視窗的邊界,我們可以看到視窗下面的內容。這其中同時具有一個的透明和模糊效果。但是,在實現毛玻璃時,為了不讓下面的視窗內容過於清晰影響上面的視窗,DWM組還對下面的視窗實現了模糊效果。

其中的實現要點有

1、模糊下面的內容,這是由自定義的象素Shader實現,這個Shader是一個完全運行在GPU的小程式,它可以並行處理多個象素。

2、模糊只是針對視窗邊界下的部分內容。這些內容需要從不同的緩衝提取出來。

3、摸索的方法類似於平均值處理:一個象素的值等於其鄰居象素的平局值。

眾所周知,Direct3D支持多個Surface,最後顯示不同Surface時是通過Flip(翻轉)實現的,DWM也是如此。這樣實現的結果就是不會在出現以前的Tearing。使得桌面變得更平滑。

現在,我們的桌面雖然稱得上是一個全螢幕幕的Direct3D應用程式。不管是老式只支持帖圖加速的圖形處理器還是新型的高速圖形處理器,我們都需要操作圖形處理器的存儲系統。這就出現了兩個重要的問題:

1、在視窗很多時,運行DWM需要的記憶體將是一個問題,它隨著用戶的視窗數增加而增加。

2、DWM會與其它的應用程式共享記憶體資源。比如DirectX應用程式、視頻回放和WPF應用程式等等。

解決這些問題,微軟提出了Windows顯示驅動模型(Display Driver Model)。WDDM是Vista及以後作業系統的新的DirectX驅動模型。WDDM主要提供三項功能:1、虛擬化視頻記憶體。2、允許與GPU的互動。3、允許DirectX表面可以跨進程共享。

在WDDM中,顯示內容是虛擬化的。這就表示顯示內容與系統記憶體一樣。我們知道,在系統記憶體中如果記憶體分配完畢,此時還有新的分配要求,就會產生第二存儲頁面,然後由系統管理存儲頁面和主存儲的頁面算法和機制。現在,主存儲是顯示記憶體,而第二存儲頁面是系統記憶體。在顯示存儲和系統記憶體都分配完後,將使用磁碟作為視頻記憶體表面。當然,這種情況比較少見。但是這樣的設計使得WDDM足夠的健壯,應用程式的可靠性也得到增強。在WDDM而言,它將實現非常關鍵的功能:執行記憶體的分配、實現分配記憶體和真正的顯示記憶體的控制。WDDM本身也在不斷的改進中。

既然WDDM已經實現了顯示記憶體的虛擬化,那么這就意味著WDDM具有調整應用程式的GPU命令優先權的功能。這種功能通常是由WDDM調度程式實現。因此WDDM必須能中斷GPU的某些操作,並保存操作的上下文,以備在必要時恢復操作繼續運行。基於這項功能,WDDM提供了兩種級別的調度支持:

1、基本調度。它是基於DirectX9的WDDM驅動和硬體所支持的調度粒度。也就是說單獨的Primitive和Shader程式不能被中斷,上下文交換必須在它們完成後進行。

2、高級調度。它是基於DirectX10的WDDM驅動和硬體所支持的調度粒度。這種調用支持比Primitive和Shader更細粒度的中斷。注意,雖然DirectX10支持高級調度,但是它並不是DirecX10所必須的。也就是說,只有部分硬體支持高級調度。桌面視窗管理器使用DirectX9,因此它是支持基本調度。

前面曾經提到過,通過WDDM可以支持Surface的跨進程共享。共享DirectX表面對於重定向DirectX應用程式非常重要。因為Vista必須要和以前的應用程式兼容,就必須支持以前用GDI、、DirectX編寫的應用程式。WDM必須把這些應用程式的視窗重定向到Surface,然後由WDM統一合成、最後顯示一個單一的Surface。

需要注意的一點是:WDM只重定向Top-level的視窗。而對於MDI應用程式,它的所有Top-level視窗、子視窗會被合成為單獨的一個Surface,然後交給DWM合成。根據以前的Windows圖形系統。重定向主要分為以下三類:

1、只用GDI顯示的視窗

毫無疑問,GDI應用程式在當今任是主流。WDM在重定向基於GDI的應用程式時,基本過程如下:

A、在系統記憶體中分配一個和視窗大小一樣的記憶體塊,然後和視窗關聯。

B、顯示記憶體中也分配一個同樣大小、指定象素格式的顯存塊。

C、然後,當應用程式獲得視窗的DC時,因為這個視窗還沒有參與到WDM的合成,所以現在,它活動的DC不在是主視頻記憶體中,而且前面在系統記憶體中分配的記憶體塊。

D、經過GDI的操作後,在系統記憶體形成一個Surface。

E、系統會根據視窗的各種參數、適當的從系統記憶體複製顯示內容到視頻記憶體中。

F、這樣,視頻記憶體的數據就和視窗保持一致,剩下的工作就由WDM完成:合成各個Surface,形成最終的桌面。

其他信息

另外還有兩點需要特別說明

(1)、雙緩衝視窗。現在,雙緩衝技術顯示的視窗特別多,它能有效的避免閃爍。確實,在使用了雙緩衝的GDI視窗中,它本身就有兩個記憶體塊,一個在系統,一個在顯示卡。所以問題來了:為什麼重定向時不直接使用雙緩衝中的顯示記憶體塊呢?這樣做主要有兩個問題:一是格式不相同,GDI顯示的格式和DirectX的格式不相同。GDI不支持以DirectX格式進行提交。二是很多GDI操作(XOR、文本、Alpha混合等等)是一種“讀取-修改-寫回”這樣的三步操作。如果重定向時直接使用顯存塊,GDI顯示的時候必須從顯存讀取原來的顯示內容到CPU(或者系統記憶體),然後再修改,最後寫回到顯存。這樣的操作效率非常低。所以沒有採用。

(2)、最小化視窗。通常,最小化後的視窗只顯示在系統列的一個很小範圍內,我們需要畫視窗的大小估計也只有130X30。但是,在DWM中沒有採用這種用法。因為,如果視窗最小化後我們把Surface的大小修改為130x30再按需顯示,這樣會在Filp3D或者取縮略圖時有問題,因此視窗已經被修改。所以,DWM在視窗最小化後保存了最後一次更新的Sureface內容。

只用DirectX顯示的視窗

由於DirectX應用程式通常是通過調用Present()函式進行Surface的提交,所以這類應用程式通常只需要一個視窗緩衝就可以實現重定向。這種DirectX視窗的重定向是由DirectX系統(實際上是DirectX 10)處理的,當DirectX10決定顯示某個Surface時,它會調用DWM的接口,以此實現跨進程的共享。DirectX 10的“Furface共享”是一個非常獨特的功能,其建立在WDDM之上。這也是運行DWM必須要WDDM的關鍵原因之一。

當Present()顯示Surface時,DWM會得到通知,表示應該更新其原來的視窗Surface,更新後DWM再重新進行合成。注意WPF應用程式也是DirectX應用程式。它們也是採用這種重定向方式。

混合GDI和DirectX的視窗

現在,有很多的Top-level視窗採用了GDI+DirectX的方式進行內容顯示。根據混合的方式不同結果也不同。如果Top-Level視窗以及它的每個子視窗是用唯一的方式進行顯示,比如主視窗只用DirectX,子視窗只用了GDI,DWM對這樣的視窗會形成自己的“合成”樹。沒有子視窗單獨顯示,然後整個Tree的Surface被合成為傳遞給桌面。這樣的混合方式能很好的實現。

對於單獨一個Top-level視窗同時使用GDI+DirectX顯示,比較麻煩。特別是GDI+DirectX對視窗的某個區域進行重複顯示的情況。DWM通常不支持這樣的視窗。

相關詞條

相關搜尋

熱門詞條

聯絡我們