XP的GDI模型:

XP用的是XPDM驅(qū)動模型,簡單來說就是GDI32直接調(diào)用內(nèi)核(Win32k.sys)內(nèi)的圖形引擎, 圖形引擎會再調(diào)用顯卡驅(qū)動, 對于顯卡驅(qū)動沒有實(shí)現(xiàn)的接口, 圖形引擎會用軟件實(shí)現(xiàn)。所以這種情況下我們一般窗口的Render操作都是直接畫到顯示器上。( 當(dāng)然也有例外, 就是Layered window (WS_EX_LAYERED) , 所有的Layered windows因?yàn)橛蠥lpha通道,系統(tǒng)進(jìn)行了緩存, 最終才合成輸出到顯示器上的, 所以Layered windows比較耗資源, 我們抓屏?xí)r可以通過CAPTUREBLT表明是否需要過濾該類型窗口。)
Vista之后系統(tǒng)用了WDDM驅(qū)動模型, 該模型從Vista的1.0到Win10已經(jīng)是2.0。

該模型提供了2套render相關(guān)的API, 一套是傳統(tǒng)的GDI API, 還有一套是新的Dxgi接口, 當(dāng)然傳統(tǒng)的GDI在內(nèi)核中也有部分是通過Dxgi實(shí)現(xiàn)的。
基于新的Dxgi接口,系統(tǒng)在應(yīng)用層提供了D2D, D3D, DirectComposition等API。
在該模型下, 所有的窗口在系統(tǒng)中都有緩存(客戶區(qū)內(nèi)容), 所以所有的窗口實(shí)際上都是Layered windows了。
另外系統(tǒng)提供DWM桌面管理器, 它負(fù)責(zé)將所有的桌面窗口進(jìn)行合成,所以我們可以看到3D或者毛玻璃效果, 最后再顯示到桌面。
未來微軟的期望應(yīng)該是逐步拋棄現(xiàn)有的GDI,逐步轉(zhuǎn)到Dxgi這套新的API上來, 現(xiàn)在新的系統(tǒng)應(yīng)用已經(jīng)都基于這套新的render API, 但是考慮到歷史包袱和兼容性,很長世間內(nèi)應(yīng)該會2套共存.
這樣現(xiàn)在Windows提供了2種應(yīng)用開發(fā)的方式, 一種是傳統(tǒng)的桌面程序(很大部分是基于GDI的), 還有一種就是UWP(Universal Windows Platform)應(yīng)用, 這種應(yīng)用就是所謂的通用應(yīng)用(跨Mobile/Surface/PC/Xbox/HoloLens)。
通用應(yīng)用基于WinRT, 即Windows Runtime, 當(dāng)然這里runtime和.net的CLR以及java的JVM不同, 人家是真正的runtime(字節(jié)碼解釋器), 而WinRT僅是一套API。當(dāng)然WinRT的API也有自己的特色: 接口實(shí)現(xiàn)基于COM,面向?qū)ο螅?接口描述基于元數(shù)據(jù),跨語言;界面實(shí)現(xiàn)基于D3D, 用Xaml描述。對于這套API的實(shí)現(xiàn),不同平臺會不一樣,如果是X86的PC, 很大程度上是在原有的Win32應(yīng)用層進(jìn)行封裝(只不過弄了個沙箱, 進(jìn)行了一些權(quán)限控制); 如果是ARM版, 內(nèi)部實(shí)現(xiàn)肯定和X86不一樣, 但只要API保持不變, 對上層應(yīng)用都是透明的。
在Win10上,現(xiàn)在的WinRT桌面應(yīng)用已經(jīng)和傳統(tǒng)的Win32應(yīng)用程序沒太大差距了,都可以直接以窗口的形式跑在傳統(tǒng)桌面上, 只不過權(quán)限有些不一樣(WinRT app是appContainer權(quán)限, 只能訪問自己的安裝目錄)。兩者還有一個不一樣就是render的方式, 傳統(tǒng)的大部分還是基于GDI,而WinRT App是基于Xaml, 而Xaml又是基于D3D和Dxgi的。
Win10的虛擬桌面層讓人覺得比較好奇, 可后來發(fā)現(xiàn)微軟僅僅是在DWM里做了些手腳, 簡單來說就是讓窗口進(jìn)程關(guān)聯(lián)了某個虛擬桌面, DWM在合成時僅顯示當(dāng)前虛擬桌面的窗口。曾經(jīng)也很好奇為什么很多WinRT窗口明明窗口屬性是Visible 的,但是桌面上為什么不顯示,其實(shí)也是DWM做了些手腳, 當(dāng)然微軟后來提供了API讓我們區(qū)分一個WinRT窗口是否真的可見。
posted on 2016-03-16 22:09
Richard Wei 閱讀(3977)
評論(1) 編輯 收藏 引用 所屬分類:
windows desktop