WPF全景體驗

WPF全景體驗

2007130Windows Vista正式全球同步發佈。此舉標誌着Windows Vista已經旋風般地吹向了整個網絡世界。比爾蓋茨預言:只需要三分鐘時間就能讓用戶接受Windows Vista。但是,微軟如何才能做到這一點呢?其中最關鍵的一點就是Windows Presentation FoundationWPF),她依賴於WPF所帶來的震撼視覺效果和用戶體驗。

UI的歷史

            從視窗界面的出現開始,用戶界面(UI)就進入了一個特殊的歷史時期。在隨後幾年裏,出現了很多具有歷史意義的界面風格。現在,經典的Windows窗口風格已經存在了10多年,即使是深受用戶喜愛的Windows XP風格也已出現五年有餘。無疑大家與我一樣,期待着全新視覺界面的出現。另一方面,當今計算機處理芯片飛速發展,特別是顯示芯片,顯示卡幾乎成爲了一臺微型的計算機。但是,其強大的處理能力卻沒有得到充分的應用。目前,顯示卡GPUGraphics Processing Unit)的處理能力大多隻應用在遊戲和多媒體領域。爲了給用戶提供最強的體驗,滿足不斷提高的用戶視覺需求,Windows Vista引入了全新的圖形子系統——WPF。她能充分利用顯示卡的處理能力提供給用戶最絢的視覺效果。

            Windows Vista之前,Windows平臺的圖形系統主要有:GDIGDI+Direct3D。其中,GDI的應用領域最爲廣泛。GDI圖形系統已經形成了很多年。她提供2D圖形處理、文本處理,以及受限的圖像處理功能。雖然在一些顯示卡上支持部分的GDI加速,但是其效果與當今的Direct3D相比還是很微弱。GDI+開始出現是在2001年,她引入了2D圖形的反走樣、浮點數座標、漸變以及單個象素的Alpha支持。她幾乎支持所有的常用圖像格式。但是,GDI+沒有任何加速功能(全部是用軟件實現)。

 


1NT系統圖形結果簡圖

            爲了兼容性,GDIGDI+Windows Vista中仍被支持,對她的改進也主要集中在安全性和客戶相關問題上,功能性基本上沒有任何的改進。

下一代圖形系統——WPF

Windows Vista中,GDIGDI+WPF並行存在。但是,WPF所有的提交都不依賴於GDIGDI+,而是Direct3D。並且所有的Primitive都是通過Direct3D的本地接口實現的。請參考圖2WPF核心組件。

 


2WPF核心組件

注意圖中的milcore組件,她的職責是完成與Direct3D的交互。並且出於效率考慮,milcore由非託管代碼實現。我們還注意到,PresentationFrameworkPresentationCore都位於通用語言運行(CLR)之上。很顯然,WPF的大部分代碼都是以託管形式存在的。當然,在一些顯示卡不支持所需要的功能時,WPF也提供了稍微低效的軟件實現,以此來支持在某些PC上運行WPF應用程序。

對於開發人員,我們最關心的WPF所提供的功能。從圖3WPF基本功能結構中我們就可以看到其豐富的功能。是的,WPF集成處理了過去的圖形、多媒體、文檔等功能。爲她們的編程開發提供了統一的編程模型。我們不再需要去關注媒體、文檔的內部處理區別,將開發人員與處理細節真正地隔離開來,這是非常讓人激動的功能!

 


3WPF基本功能結構

 事實上,在Windows Vista中,圖形系統最關鍵的改進就是引入了新的顯示驅動模型(Windows Display Driver Model)。前面曾提及我們有大量的顯示卡資源被閒置,爲了安全、高效地利用這些資源,WDDM驅動模型提供了與操作系統虛擬化內存、讓多個應用程序同時運行相類似的功能。她虛擬化了顯示卡的資源(主要是顯示內存),提供了一個調度程序,使得多個基於Direct3D的應用程序可以共享顯卡(比如WPF應用程序和基於WPFWindows Vista桌面窗口管理器),WDDM的健壯性、穩定性也得到了顯著提高。大量的驅動操作從內核(Kernel)模式移動到了用戶(User)模式,這樣不僅提高了安全性,還簡化了顯示驅動的開發過程。

 


4WPF圖形系統

另外,在Windows Vista中存在兩個版本Direct3DDirect3D 9Direct3D 10WPF依賴於Direct3D 9,這樣能更廣泛的解決兼容性問題。畢竟,硬件要求越低,能支持的PD越多。另一個非常重要的原因就是爲Windows Vista的服務器版本提供方便,因爲服務器版本的Windows Vista對顯示卡和Direct3D基本上沒有任何特殊的要求,同時Windows Vista也支持Direct3D 10Direct3D 10依賴於WDDM,只能在Windows Vista上使用。由於Windows XP沒有WDDM,雖然Microsoft做了很大的努力來改善Windows XPDirect3D 9相關的驅動,提高內容的顯示質量,但是由於Windows XP中沒有虛擬化顯示卡資源,只能強制所有的應用程序都採用軟件提交。

基於WPF的開發

            那麼,對於開發人員,基於WPF的應用程序開發又會是怎樣呢?爲了實現應用程序UI和邏輯的分離、設計人員可以更快速、高效地完成UI,微軟在WPF中引入了一種全新的基於XML的、聲明式編碼語言——XAML。讓我們先睹爲快,用XAML實現一個“Hello, World”:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml "

                        Title=”Hello, World”>

                        <Label>Hello, World</Label>

</Window>

            使用過XML或者某些腳本的讀者應該對這種編程方式非常親切。是的,XAML改變了我們過去的編程方式。關於XAMLWPF實在有太多的內容,限於篇幅,這裏我將向大家介紹WPF中兩個非常重要的概念:視覺樹和邏輯樹,它們對我們理解WPF編程模式有非常大的幫助。

爲了更加形象地理解視覺樹和邏輯樹,我們看一個稍微複雜些的“Hello, World”程序:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

                        Title=”Hello, World”>

                        <StackPanel>

<Label>Hello, World</Label>

                        </StackPanel>

</Window>

在這個簡單的應用程序中,Window是一個根結點,它有一個子結點StackPanel,而StackPanel有一個子結點Label,注意Label下還有一個子結點String 也就是標籤控件顯示的字符串內容),它同時也是一個葉子結點。這四個對象構成了窗口的一個邏輯樹結構。邏輯樹結構始終存在於WPFUI中,不管UI是用XAML編寫還是用代碼編寫。WPF的每個方面(屬性、事件、資源等等)都是依賴於邏輯樹的。

 


5WPF邏輯樹結構

            如果將邏輯樹和視覺樹對比理解,邏輯樹通常是指我們在UI邏輯中涉及到的界面元素。而視覺樹是指系統在顯示UI過程中顯示的所有元素,它暴露了視覺的實現細節。

 


圖6
WPF的視覺樹

並不是所有的邏輯樹結點都可以擴展爲視覺樹結點。只有從System.Windows.Media.VisualSystem.Windows.Media.Visual3D繼承的元素才能被視覺樹包含。其他的元素不能包含是因爲它們本身沒有屬於自己的提交(Rendering)行爲

Windows Vista SDK Tools當中的XamlPad提供查看視覺樹的功能。需要注意的是XamlPad目前只能查看以Page爲根元素,並且去掉了SizeToContent屬性的XAML文檔

我們可以看到視覺樹確實比較複雜,其中還包含有很多的不可見元素,比如ContentPresenter。視覺樹雖然複雜,但是在一般情況下,我們不需要過多地關注它。我們從根本上改變控件的風格、外觀時,需要注意視覺樹的使用,因爲在這種情況下我們通常會改變控件的視覺邏輯。

WPF中還提供了遍歷邏輯樹和視覺樹的輔助類:System.Windows.LogicalTreeHelperSystem.Windows.Media.VisualTreeHelper。注意遍歷的位置,邏輯樹可以在類的構造函數中遍歷。但是,視覺樹必須在經過至少一次的佈局發生之後才能形成,所以它不能再構造函數遍歷。通常是在OnContentRendered進行,這個函數在佈局發生後被調用。

其實,每個樹結點元素本身也包含了遍歷的方法。比如,Visual類包含了三個保護成員方法VisualParentVisualChildrenCountGetVisualChild。通過它們可以訪問結點的父元素和子元素。而對於FrameworkElement,它通常定義了一個公共的Parent屬性表示其邏輯父元素。特定的FrameworkElement子類用不同的方式暴露了它的邏輯子元素。比如部分子元素是Children Collection,有時Content屬性,Content屬性強制元素只能有一個邏輯子元素。

WPFWindows Vista中的應用——桌面窗口管理器

桌面窗口管理器(Desktop Window ManagerDWM)是Windows Vista中的一個新組件。她建立在WPF核心圖形層組件(milcore)基礎之上。她利用WPFComposition引擎進行多個窗口內容的合成。她的出現幾乎改變了Windows Vista中應用程序的屏幕像素顯示方式。

通過桌面窗口管理器的桌面合成,應用程序的顯示不再是直接畫到屏幕上,而是一個顯示內存中的一個離屏Surface。然後由桌面窗口管理器將這些Surface合成顯示到屏幕之上。

從用戶體驗的角度看,啓用DWM後,提供的視覺效果有毛玻璃框架、3D窗口變換動畫、窗口翻轉和高分辨率支持。其中最明顯的特徵有:任務欄窗口的實時縮略圖;Alt-TabWin-Tab組合鍵所看到的效果。

 

 





在桌面窗口管理器(

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

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

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

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

衆所周知,Direct3D支持多個Surface,最後顯示不同Surface時是通過Flip(翻轉)實現的,DWM也是如此。這樣實現的結果就是,不會再出現以前WM_PAINT消息響應帶來的的Tearing效果,從而桌面變得更平滑。

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

1、在窗口很多時,運行DWM需要的內存將是一個問題,它隨着用戶的窗口數增加而增加。

2DWM會與其它的應用程序共享內存資源。比如DirectX應用程序、視頻回放和WPF應用程序等等。

微軟利用全新的Windows顯示驅動模型WDDM解決這些問題。WDDMWindows Vista及後續操作系統中的DirectX驅動模型。WDDM主要提供三項功能:

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

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

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

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

3、允許Direct3D表面可以跨進程共享。共享Direct3D表面對於重定向Direct3D應用程序非常重要。因爲Vista必須要和以前的應用程序兼容,就必須支持以前用GDIDirectX編寫的應用程序。WDM必須把這些應用程序的窗口重定向到Surface,然後由WDM統一合成,最後顯示單一的桌面Surface。需要注意的一點是:WDM只重定向Top-level的窗口。而對於MDI應用程序,它所有的Top-level窗口、子窗口會被合成爲一個單獨的Surface,然後交給DWM合成。

前進中的WPF

另外,WPFXPS等文檔的打印輸出也得到了極大的改善。XPS文檔本身的規範也極大地提高了其打印的質量,XPS文檔的規範可以參考MSDN的資料。除了打印,Vista操作系統中對遠程的改進也部分依賴於WPF,比如有遠程協助、遠程桌面和終端服務等等。它們的實現過程是通過發送一系列的“遠程”命名到客戶端,客戶根據自己PC的性能和命名進行顯示,這樣顯示的質量能得到極大的提高。WPF中所有的提交都是矢量形式的,我們可以對圖像或窗口進行任意級的放縮,而圖像的質量不會有任何的損耗。

WPF中,對Direct3D進行各種封裝。當然,如果你本身對Direct3D/OpenGL很熟悉,也可以直接在WPF中使用。封裝後的Direct3D更容易使用,並且Web應用程序(XBAP)也可以使用Direct3D。在WPF中使用的Direct3D,沒有直接用非託管代碼控制所擁有的靈活性,也不能直接對硬件進行底層控制。

WPF對某些多媒體的功能支持還需要依賴之前的技術,比如DirectShow。當我們進行音頻視頻的捕捉或者其它任務時,只能直接用DirectShow實現,然後再用HwndHost嵌入到WPF內容當中。

利用類似的內容嵌套技術,我們可以在WPF應用程序中顯示自定義格式的內容。通過提供自定義的DirectShow CODEC,然後用Media元素實現和WPF內容毫無限制的集成。

雖然WPF被設計作爲下一代的圖形系統,但當前版本的WPF對一些Win32功能還沒有很好的支持,比如WMF/EMF文件,單個像素寬度線條等等。對於這些需求還需要使用GDI/GDI+來實現。

結束語

本文對下一代圖形系統WPF進行了全面的介紹,包括與NT系統中圖形系統的對比、WPF編程的核心概念以及WPFWindows Vista中的應用。希望通過對這些內容的介紹,讓讀者對WPF有一個全面的感性認識。而且,我們有理由相信:隨着Windows Vista的普及,WPF的應用將更加廣泛,過去痛苦的UI編程將不再出現。讓我們一起來體驗吧! 

Desktop Window ManagerDWM中,我們的每個窗口都用一個Surface表示,都可以視爲是3D的網格。雖然每個窗口仍是一個矩形,但它們都位於一個3D空間之中。窗口操作(比如最大化,還原等等)的實現已經發生了變化,它們都是對網格進行3D變換實現的,這與以往有了很大的區別。
發佈了3 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章