前面曾經提到過,通過wddm可以支援su***ce的跨程序共享。共享directx表面對於重定向directx應用程式非常重要。因為vista必須要和以前的應用程式相容,就必須支援以前用gdi、、directx編寫的應用程式。wdm必須把這些應用程式的視窗重定向到su***ce,然後由wdm統一合成、最後顯示乙個單一的su***ce。
需要注意的一點是:wdm只重定向top-level的視窗。而對於mdi應用程式,它的所有top-level視窗、子視窗會被合成為單獨的乙個su***ce,然後交給dwm合成。根據以前的windows圖形系統。重定向主要分為以下三類:
1、只用gdi顯示的視窗
另外還有兩點需要特別說明:
(1)、雙緩衝視窗。現在,雙緩衝技術顯示的視窗特別多,它能有效的避免閃爍。確實,在使用了雙緩衝的gdi視窗中,它本身就有兩個記憶體塊,乙個在系統,乙個在顯示卡。所以問題來了:為什麼重定向時不直接使用雙緩衝中的顯示記憶體塊呢?這樣做主要有兩個問題:一是格式不相同,gdi顯示的格式和directx的格式不相同。gdi不支援以directx格式進行提交。二是很多gdi操作(xor、文字、alpha混合等等)是一種「讀取-修改-寫回」這樣的三步操作。如果重定向時直接使用視訊記憶體塊,gdi顯示的時候必須從視訊記憶體讀取原來的顯示內容到cpu(或者系統記憶體),然後再修改,最後寫回到視訊記憶體。這樣的操作效率非常低。所以沒有採用。
(2)、最小化視窗。通常,最小化後的視窗只顯示在工作列的乙個很小範圍內,我們需要畫視窗的大小估計也只有130x30。但是,在dwm中沒有採用這種用法。因為,如果視窗最小化後我們把su***ce的大小修改為130x30再按需顯示,這樣會在filp3d或者取縮圖時有問題,因此視窗已經被修改。所以,dwm在視窗最小化後儲存了最後一次更新的sureface內容。
2、只用directx顯示的視窗
由於directx應用程式通常是通過呼叫present()函式進行su***ce的提交,所以這類應用程式通常只需要乙個視窗緩衝就可以實現重定向。這種directx視窗的重定向是由directx系統(實際上是directx 10)處理的,當directx10決定顯示某個su***ce時,它會呼叫dwm的介面,以此實現跨程序的共享。directx 10的「fu***ce共享」是乙個非常獨特的功能,其建立在wddm之上。這也是執行dwm必須要wddm的關鍵原因之一。
當present()顯示su***ce時,dwm會得到通知,表示應該更新其原來的視窗su***ce,更新後dwm再重新進行合成。注意wpf應用程式也是directx應用程式。它們也是採用這種重定向方式。
3、混合gdi和directx的視窗
現在,有很多的top-level視窗採用了gdi+directx的方式進行內容顯示。根據混合的方式不同結果也不同。如果top-level視窗以及它的每個子視窗是用唯一的方式進行顯示,比如主視窗只用directx,子視窗只用了gdi,dwm對這樣的視窗會形成自己的「合成」樹。沒有子視窗單獨顯示,然後整個tree的su***ce被合成為傳遞給桌面。這樣的混合方式能很好的實現。
對於單獨乙個top-level視窗同時使用gdi+directx顯示,比較麻煩。特別是gdi+directx對視窗的某個區域進行重複顯示的情況。dwm通常不支援這樣的視窗。
Windows Vista 遠端桌面連線引數
windowsvista 遠端桌面連線引數 mstsc v console f ullscreen w h public span edit connection file migrate connection file 指定連線的 rdp 檔案的名稱。v 指定要連線到的遠端計算機。console ...
Windows Vista 桌面視窗管理器(1)
桌面視窗管理器是什麼呢?它是vista中的乙個新元件 desktop window manager dwm 它建立在wpf核心圖形層元件基礎之上。還記得我在第乙個post中所提到的composition引擎嗎?dwm的桌面合成就是建立在這個composition引擎基礎之上的新特徵。它的出現幾乎改變...
Windows Vista桌面視窗管理器(3)
前面曾經提到過,通過wddm可以支援su ce的跨程序共享。共享directx表面對於重定向directx應用程式非常重要。因為vista必須要和以前的應用程式相容,就必須支援以前用gdi directx編寫的應用程式。wdm必須把這些應用程式的視窗重定向到su ce,然後由wdm統一合成 最後顯示...