天天看點

WPF與Win32圖形系統

說明:這裡的Win32特指Vista作業系統之前的所有圖形系統:GDI、GDI+、Direct3D。   GDI是當今應用程式的主流圖形庫,GDI圖形系統已經形成了很多年。它提供了2D圖形和文本功能,以及受限的圖像處理功能。雖然在一些圖形卡上支援部分GDI的加速,但是與當今主流的Direct3D加速相比還是很弱小。GDI+開始出現是在2001年,它引入了2D圖形的反走樣,浮點數坐标,漸變以及單個象素的Alpha支援,還支援多種圖像格式。但是,GDI+沒有任何的加速功能(全部是用軟體實作)。   目前版本的WPF中,對一些Win32功能還沒有很好的支援,比如WMF/EMF檔案,單個象素寬度的線條等等。對于這些需求還需要使用GDI/GDI+來實作。   在Windows Vista中,GDI和GDI+仍然支援,它們與 WPF并行存在,但是基本上沒有任何功能性的改進。對GDI和GDI+的改進主要集中在安全性和客戶相關問題上。WPF的所有送出都不依賴于GDI和GDI+,而是Direct3D。并且所有的Primitive都是通過Direct3D的本地接口實作的。還記得我前面随筆中提到過的Milcore嗎?它就是和Direct3D互動的非托管代碼元件。由于WPF的大部分代碼都是以托管代碼的形式存在的,是以WPF中有很多托管、非托管的互動。當然,在一些圖形卡不支援WPF所需要的功能時,WPF也提供了稍微低效的軟體實作,以此來支援在某些PC上運作WPF應用程式。   在Windows Vista中,Direct3D的關鍵改進就是引入了新的顯示驅動模型。VDDM驅動模型虛拟化了顯示卡上的資源(主要是顯示記憶體),提供了一個排程程式,是以多個基于Direct3D的應用程式可以共享顯示卡(比如WPF應用程式和基于WPF的Windows Vista桌面視窗管理)。VDDM的健壯性、穩定性也得到了提高,大量的驅動操作從核心(Kernel)模式移動到了使用者(User)模式,這樣提高了安全性,也簡化了顯示驅動的開發過程。   在Windows Vista中存在兩個版本的Direct3D:Direct3D 9和Direct3D 10。WPF依賴于Direct3D 9,這樣能更廣泛的解決相容性問題。另外一個非常重要的原因就是為Vista的伺服器版本提高友善,因為伺服器版本的Vista對顯示卡和Direct3D基本上沒有任何的要求。同時WPF也支援Direct3D 10。Direct3D 10依賴與VDDM,隻能在Windows Vista上使用。由于Windows XP沒有VDDM,雖然Microsoft做了很大的努力來改善XP中Direct3D 9相關驅動,提高内容的顯示品質,但是由于XP中沒有對顯示卡資源的虛拟化,強制所有的應用程式都用軟體送出。

WPF對某些多媒體的功能支援還需要依賴老的技術,比如DirectShow。當我們進行音頻視訊的捕捉或者其它任務時,隻能直接用DirectShow實作,然後再用HwndHost嵌入到WPF内容當中。   利用類似的技術,我們可以在WPF應用程式中顯示自定義格式的内容。通過提供自定義的DirectShow CODEC,然後用Media元素實作和WPF内容毫無限制的內建。   另外,WPF對XPS等文檔的列印輸出也得到了極大的改善。XPS文檔本身的規範也極大的提高了其列印的品質,XPS文檔的規範可以參考MSDN的資料。除了列印,Vista作業系統中對遠端的改進也部分依賴于WPF,比如有遠端協助、遠端桌面和終端服務等等。它們的實作過程是通過發送一系列的“遠端”命名到用戶端,客戶根據自己PC的性能和命名進行顯示,這樣顯示的品質能得到極大的提高。   在WPF中,對Direct3D進行各種封裝。當然,如果你本身對Direct3D/OpenGL很熟悉,也可以直接在WPF中使用。封裝後的Direct3D更容易使用。并且在Web應用程式(XBAP)也可以使用Direct3D。在WPF中使用的Direct3D,沒有直接用非托管代碼控制所擁有的靈活性,也不能直接對硬體進行底層控制。 WPF中所有的送出都是矢量形式的,我們可以對圖像或視窗進行任何級的放縮,而圖像的品質不會有任何的問題。