關於GDI、D2D、Windows7的圖形架構

最近看了一些關於GDI/GDI+/D2D/D3D的東東,看到幾篇不錯的文章,分享一下。

 

深度解讀 - Windows 7核心圖形架構細緻分析

編輯:馬志文

時間: 2009-12-29

連接:http://technet.microsoft.com/zh-cn/library/ee921514.aspx

如現在大家所想的那樣, Windows7 其實是 Windows Vista 的改進版。 Windows 7 在 Windows Vista 的基礎上進行了大量的完善工作,也加入了不少新特性。 Vista 與其上一代 XP 相比,提供了非常大的改進,然而一方面這些改進過於巨大,用戶乃至相應軟件廠商(如, DirectX 10 應用開發商)一時無法完全接受,另一方面,由於特性的不完全具備, Vista 的表現沒有想象之中的那麼好。到了 Windows 7 ,包括操作系統本身、軟件廠商和用戶都已經做好了準備,因此反響比 Vista 更好也就不難理解了。

圖形界面一直是 Windows 系統的核心,而從 Windows Vista 開始, Windows 就開始將提供一個富圖形化的桌面圖形界面作爲要目,不僅僅是因爲 Vista 和 7 的桌面本身就是一個 3D 應用程序,而是因爲 Vista 和 7 可以更好地發揮圖形加速硬件的作用。從 Windows Vista 到 Windows7 ,操作系統與 GPU 的結合越來越緊密。

http://image3.it168.com/2009/9/25/af273a9d-8c60-4e34-9081-ad8e20e1e7bc.jpg

雖然人們經常可以聽到 Windows7 的大更新在於一個 DirectX 11.0 API ,然而對於 Windows 系統的圖形架構來說,雖然 DirectX 也很重要,不過這還不是全部。一個圖形架構包括瞭如何利用 GPU 加速各種各樣的圖形應用( 2D 、 3D 、打印等)、如何顯示到最終顯示設備上,以及包括設備檢測、控制。 Window 7 在圖形架構方面的更新主要有如下方面:

WDDM 1.1 :新的驅動模型
DirectX 11 :更新的 Direct3D 11 ,以及相關的新 Direct2D API
DXVA-HD :高清視頻回放加速
顯示設備連接和配置
色彩管理
高 DPI 輸出和可讀性
多 GPU 系統
聯合顯示適配器(又叫聯合渲染)

下面,會就這些改進進行簡單的介紹。

http://image3.it168.com/2009/9/25/b5e5b73e-ddd8-4f94-b94a-cb10eba4ff83.jpg
Windows 7 核心圖形架構

Windows 應用程序使用各種如 GDI ( Graphics Device Interface , 2D 時代系統的主要圖形接口)、 Direct3D 、 OpenGL 這樣的 API 和系統圖形組件通信,而系統組件通過 WDDM ( Windows Display Driver Model ,又名 Longhorn Display Driver Model )與硬件交互,從 Vista 起, Windows 就採用了和 XP 使用的 XPDM 不同的新的驅動模型: WDDM ,使用的驅動模型在很大程度上決定了一個系統的圖形特性。 Vista 使用的 WDDM 版本爲 1.0 ,而 Windows7 使用的改進版本爲 WDDM 1.1 。

http://image3.it168.com/2009/9/25/0ae8ed1c-c96f-43d0-b388-84e5a88e7fcd.jpg

http://image3.it168.com/2009/9/25/b85da95c-8fcc-4d31-8d00-9ec826824352.jpg
http://image3.it168.com/2009/9/25/4909a46b-4ce1-40b4-ab2d-cc63303c11f6.jpg

WDDM 1.1 帶來的改動挺多的,下面我們先來看看 WDDM 1.0 相對 XPDM 的改動,也就是 Vista 相對 XP 的改動

  http://image3.it168.com/2009/9/25/90330b67-8ae6-420f-9762-2938daa50bb1.jpg
XPDM :非合成模型

 

http://image3.it168.com/2009/9/25/4abc911f-5fa1-4935-8d78-5d7043c5819b.jpg
WDDM :合成模型

  在垂直同步之謎 XP/Vista 與 3D 性能測試中,筆者解釋過 XP/Vista 的模型的不同之處,在 WDDM 模型下,所有的應用程序生成的顯示畫面最後會在 DWM ( Desktop Windows Manager ,桌面窗口管理器)內進行合成爲單一的最後輸出畫面,因此獲得了更好的顯示效果(天生的所有程序垂直同步)、額外效果(縮略圖、縮放)以及可以支持更大的左面,不過,原始的 WDDM 1.0 只是實現了這個大架構上的轉換,細節上仍未夠完美:

  http://image3.it168.com/2009/9/25/f8c5cbdb-2d16-4d3c-bfc4-2b83e0ffe189.jpg

在 Vista 下, GDI (繪製通常的 2D 窗口的 API ,此外還有很多其他圖形操作使用 GDI )和 DirectX ( 3D 應用 API )具有着不同的處理方法: Direct3D 是硬件加速的,而 GDI 則不是( GDI 在 XPDM 時是硬件加速的),因此 Vista 用戶在一些圖形程序上會感到比 XP 慢;而且 GDI 應用程序先經過 CPU 軟件處理到系統內存上,再傳輸到顯卡驅動分配的 GDI 顯存區域上(也在系統內存當中),再由 DWM 負責將畫面合成輸出到顯示器

http://image3.it168.com/2009/9/25/494eade4-d4ff-49d2-9383-ce058bd6dea4.jpg

Windows 7 當中, GDI 獲得了硬件加速(這個見下面) —— 不過在混合使用 GDI 和 Direct3D API 的時候, GDI 仍然無法硬件加速,不過, GDI 直接輸出到驅動的 GDI 顯存區域,減少了一個步驟,同時降低了內存消耗(同時對混用的 Direct3D API 也有效);顯然,混合食用 API 來進行圖形編程並不是一個好主意(當然,同時使用 GDI 和 Direct3D 意味着這個是一個老的、窗口模式的 3D 應用程序,如 Windows 模式的老 3D 遊戲)

http://image3.it168.com/2009/9/25/a2af814f-5284-4ea4-8785-6ddafaca7590.jpg

老的 WDDM 1.0 處理 GDI 應用程序就如前面說過的一樣

http://image3.it168.com/2009/9/25/5483ea3d-114a-4f8e-baa8-802a34b83800.jpg

而在 Windows 7 WDDM 1.1 模型當中,單獨的 GDI 將會通過 WDDM 與 GPU 進行硬件加速,同時經過 GDI 顯存區域輸出到 DWM ,表現在實際操作上,就是大部分窗口操作都變得比 Vista 更流暢,日常工作更快捷(大部分 2D 應用程序都使用了 GDI API ,因爲 GDI 包括的內容太多,因此必須對其保持兼容;關於 GDI ,後面還有相關內容)

http://image3.it168.com/2009/8/17/db28f355-3c7c-424e-b988-b737ff9ac353.jpg
Windows XP 的Direct3D/GDI驅動架構

http://image3.it168.com/2009/9/25/aed663bb-2e6f-4f7e-b4fb-3e69d7d1835d.jpg
Windows Vista 核心圖形架構,比起 XP 來要豐富了很多

http://image3.it168.com/2009/9/25/d24c656e-73dd-4457-858f-d5056e9214bb.jpg

Windows 7 核心圖形架構,老的 GDI/GDI+ 仍被單獨支持,不過, Windows 7 提供了它們對應功能的新的實現方法相比 Vista 帶的 DirectX 10 , Windows 7 自帶了 DirectX 11 ,和 WDDM 1.0 到 1.1 的變化不同, DirectX 11 的版本號表示其變化更大一些。 Windows 7 DirectX 11 改變了以往的工作模式,將 Direct3D 10.1 升級到 Direct3D 11 ,同時將以前 Vista 無法硬件加速的 GDI/GDI+ 的工作重新劃分、引入新的 Direct2D 和 DirectWrite API 來完成:

http://image3.it168.com/2009/9/25/66504e07-1f86-4f9f-a999-46085adce9e3.jpg

以前的圖形操作大部分由 Diredt3D 和 GDI/GDI+ 完成(此外還有一個 WIC——Windows Image Component ,管理掃描、打印和圖形解碼等工作),而在 Vista 當中, GDI 是無法硬件加速的 —— 因此 Vista 顯得很慢,在 Windows 7 中, GDI 的工作除了通過 WDDM 模型的改變獲得硬件加速之外,它們還按照面向的應用重新劃分爲 Direct2D ( 2D 加速)、 DirectWrite (文本處理)和 DXGI 1.1 (設備控制),這些新的 API 或者新分配到的 API 具有着硬件加速,例如, Direct2D 就實際上是通過 Direct3D 10 來完成加速:

Direct2D
硬件加速的即時模式 2 維圖形 API ,它在 2 維幾何圖形、位圖和文本方面有着較高的性能和質量。 Direct2D API 是設計與 GDI 、 GDI+ 和 Direct3D 之間進行互操作的。

DirectWrite
DirectWrite 提供高質量的文本呈現、具有獨立分辨率的輪廓字體、完整的 Unicode 文本以及佈局支持。在使用 Direct2D 的時候, DirectWrite 是硬件加速的。

http://image3.it168.com/2009/9/25/090e9d99-5d1a-45d6-9af3-be562b9e4242.jpg

當系統不支持 Direct3D 10 的時候, Windows 7 會通過一個額外的 10Level9 軟件層使用 D3D9 來完成工作,顯然,爲了最好的效率,你需要使用 Direct3D10 的顯卡,因爲 Windows 7 的 DWM 基於 Direct3D 10

http://image3.it168.com/2009/9/25/fea87a5c-fdb0-42d7-b200-b6205d4428c3.jpg
字體抗鋸齒: DirectWrite 效果

http://image3.it168.com/2009/9/25/db3747e8-c0be-4443-90a9-3cfceb7e2571.jpg
Direct3D 11

Windows 7 帶的 Direct3D 11 是 D3D10 的超集,它的特點是可以同時支持運行在 Direct3D9 和 Direct3D10.1 硬件上,實際上, DirectX 11 會提供 Vista 的支持,而不是像 Direct 10 出來時那樣,只支持 Vista 而無法兼容上一代系統,這導致了軟件開發廠商們向 DirectX 10 轉移的緩慢。 DirectX 11 支持多個硬件平臺和多種操作系統的特性讓其更容易被接受。同時 Direc3D 11 本身也具有這不少的改進,這一點會有專文討論(計劃中),這裏先談論 Windows 7 對整個圖形操作的改進,通過更多地將 GDI/GDI+ 納入 DirectX 體系獲得硬件加速,圖形界面的性能會越來越好(當然,這需要軟件廠商們使用新的 Direct2D/DirectWrite 進行編寫)。微軟希望將所有的圖形操作都構建在 DirectX 之上。

http://image3.it168.com/2009/9/25/9135de09-e8ac-4df4-b81d-41dca0d3d373.jpg

通過 Vista 中缺失的 GDI 硬件加速納入到 DirectX 體系中重新獲得硬件加速,並且性能要更快;未來顯卡廠商們將不再需要提供 GDI 加速

顯示技術  

http://image3.it168.com/2009/9/25/34bc7f7f-4253-4ff4-8bb4-98f039167b82.jpg

Windows 7 支持一系列的顯示技術,包括將數字輸出作爲原生輸出(支持 HDMI 和 DisplayPort ,而老的 VGA 模擬輸出被建議棄用), Windows 7 還原生支持更多的內容來源,如 Blu-Ray 、 JPEG-XR 、 HDR 圖片等。

http://image3.it168.com/2009/9/25/24abdb05-af47-4a9c-be00-302f3b76cf63.jpg

Windows 7 使用默認的 sRGB 色彩空間作爲所有設備都統一的工作流,但是精度提升到 30 位 —— 每一個色彩通道都增加了兩位; Windows 7 最高支持 48 位的 scRGB 模式,高精度+擴展範圍+高動態

  http://image3.it168.com/2009/9/25/4bf029cb-26c5-4ad1-9554-b7bf1d186df6.jpg
WDDM 1.1 要求驅動支持 BGRA BGRA 是最快的色彩格式

顯示設備連接和配置  

http://image3.it168.com/2009/9/25/1abf6281-d4d9-4e3e-b233-576c5a693845.jpg
Windows 7 中,所有的應用程序都在一個統一的虛擬桌面中顯示,這個虛擬桌面分辨率爲 64Kx64K 65536x65536

http://image3.it168.com/2009/9/25/55b4f865-3575-4192-8f6c-713bdddcb051.jpg

虛擬桌面按照顯示器分爲不同的視圖,每一個視圖對應一個適配器;一個適配器並不意味着一塊顯卡,一塊顯卡連接多個顯示器的時候,它就含有多個適配器,類似地, SLI 或者 CrossFireX 連接的單顯示器就意味着其是一個單一的適配器(從 Vista 開始加入,叫做 Linked-Adapter 特性)

http://image3.it168.com/2009/9/25/69553cf6-c930-4a84-8ba7-d76866fca7db.jpg
不過,在 Vista 下,無法使用多塊不同 GPU 廠商的顯卡,而 Windows 7 則可以  

http://image3.it168.com/2009/9/25/097598b5-8254-47ab-86e1-b954783824a3.jpg

在 LDA 配置下,程序界面在不同的輸出中漫遊基本上是透明的,叫做 Dynamic adapter switching 動態適配器切換

http://image3.it168.com/2009/9/25/1feceb4f-c986-4bfc-9e71-a8b9532e8e0f.jpg

在多顯示器下, Windows 7 提供了一個新的全局快捷鍵功能: Win + P ,可以快速設置多顯示器工作狀態,這個快捷鍵本來是特地爲了投影儀應用而設計

總的來說, Windows 7 的圖形架構比起 Vista 來更加完善,應用也更加方便。最明顯的就是 GDI API 的變遷了,現在 GDI 應用程序也獲得了硬件加速,就如同 XP 下一樣,比其 Vista 下只能處理器來進行處理,因此用戶們可以感覺到日常應用會更加流暢。

 

二:

原文鏈接 : 2D Drawing APIs in Windows

    在 Windows 7 操作系統中,微軟花費了很大的力氣構建了一套新的 2D 繪圖 API。我們稱之爲 Direct2D ,隸屬於 DirectX 家族。這個 API 的開發填補了 Windows 圖形平臺的一些缺陷。其中非常重要的一點就是普通的 2D 程序渲染不再缺乏硬件加速。而在 Windows Vista 中,我們知道 GDI 是無法進行硬件加速的。微軟寄望於開發的這個 API 具備很多現代特性。比如支持抗鋸齒和 Alpha Blend 的 2D 渲染,和其它現代圖形 API 交互,服務器端渲染,諸如此類。

    爲了方便理解微軟爲何開發 Direct2D ,我們先來回顧一下當初開發 Windows 時的歷史。最初的渲染系統叫做 GDI (圖形設備接口),今天仍然存在。它最初爲 16 位 Windows 寫就,隨後升級到 32 位 Windows (Windows 95 和 Windows NT)。因爲 GDI 是爲很久以前那些計算能力低下的計算機而開發的,所以它並沒有諸如抗鋸齒之類的特性,大多數 API 亦不支持 Alpha 通道。

    在 Windows 95 期間,DirectX 發佈了第一版。DirectDraw 是其中最早的組件之一。當初的本意是在硬件加速啓用的情況下,開發人員可以繞過 WinG 允許,直接訪問硬件。這樣的一個協議堆棧既可以和 GDI 協作,但是又真正處在同一地位。

    隨着圖形硬件(顯卡)演進,GDI 通過 DDI (設備驅動接口) 獲得了硬件加速的能力。很多視頻卡實現了這些 DDI ,而通過購買一塊視頻卡來改善你的 Windows 性能亦成爲平常之事。接下來,Direct3D 進駐到 DirectX 2 中,當然它也創建了自己的 DDI 集。隨之,視頻卡開始投入越來越多的精力來使得 3D 圖形越來越快,以便維持遊戲市場巨大的需求。最後導致誕生了兩個不同的領域 : 硬件加速和圖形編程。前者圍繞於 Direct3D 構建,後者則圍繞於 GDI 。

    Direct3D 和 GDI 構建於不同目標,不同位置的事實意味着它們並不能像人們期望的那樣能夠良好的工作在一起。雖然實現了不少像 GetDC 這樣的幫助橋接特性,但是在大量交叉渲染的場景下它們總是存在着或這或那的一些問題。儘管如此,微軟並沒有移除這些待解決的場景需求。

    到了世紀之交,GDI 的限制越來越顯現。微軟針對這些功能缺陷做了一個 GDI 擴展,即 GDI+ 。這些擴展提供了諸如位圖操作,畫筆,抗鋸齒和越來越複雜的 Primitive 渲染中不同像素深度格式,Alpha Blend 的支持。同時,GDI+ 亦包括了諸如打開 Png 和 Jpg 格式文件的圖像操作支持。然而,GDI+ 新增的全部操作都沒有硬件加速支持。

    GDI+ 在託管世界中非常流行,這主要得力於它是 System.Windows.Drawing 命名空間的主力。每一個客戶自定義渲染的非常漂亮的 Windows Form 程序都使用 GDI+ 來當此大任。但是,構建於 GDI 之上的 GDI+ 同樣繼承了與 Direct3D 交互的所有問題。事實上,因爲它總是軟渲染,在某些場景下,它會變得更糟。

    當時間走到計劃研發 Windows 7 時,很明顯,微軟需要解決很多互操作性的不足,以及不平衡的硬件加速能力。保留現有的 API 且要達到上述目的是相當困難的事情。GDI 有很長的歷史,這需要應付海量的應用程序兼容性問題。如果要把 Alpha Blend 支持(舉例) 弄進 GDI 核心 API 集合,而且還不得罪現有的客戶無異於天方夜譚。因爲 GDI+ 構建於 GDI 之上,舊有的陋習同樣讓它獲得硬件加速能力變得難以實現(文中說的GDI沒有實現硬件加速是指在Win7之前,Win7已經實現。)。

    解決方案就是創建新的 API 來囊括我們想要的功能和處理互操作性問題。MIL 代碼(WPF 處理渲染的原生組件)是一個很方便的起點。它有着我們想要的渲染特性,而且同時提供了軟件渲染和硬件加速。

    首先需要做的事情是使渲染代碼基於 D3D 10.1 ,而不是 D3D 9 。之所以這樣決定是因爲有一些構建於這個運行時版本的其它技術把 D3D 10.1 作爲基礎(10Level9,WARP,D3D Primitive Remoting)。而且我們還可以看到未來的硬件同樣構建於這個架構之上。這樣就能允許我們來設計 D3D 10.1 互操作性。因此就能允許與其它技術交互,比如 Direct2D 。

    另外一個互操作性工作就是利用窗口管理器和 DXGI ,以確保 Direct2D 和 GDI 能夠共同工作。你可以使用 Direct2D 繪圖到 GDI 目標,同理,反之亦可。 但是,從性能的角度來看,這些特性並非免費。它只是讓那些構建在這兩種混合 API 上的應用程序能夠平滑過渡到新世界。

    前面所作的工作中很重要的一塊就是儘量使得此 API 在性能方面富於表現力。對於開發人員來說,WPF 的好處在於它做了很重要的資源管理工作,但卻使得直接控制硬件變得困難起來。這聽起來貌似很簡單,但是這背後有着大量的設計決定以確保 GPU 內存沒有分配給不需要之人,且仍然能夠允許人們構造他們之所想。因此遵循了這樣一個原則的 Direct2D 設計和資源/線程模型就能夠允許服務器端渲染進行合適的伸縮。GDI 卻不能。

    此外,對於處理文本和圖像可以分別採用 DirectWrite 和 WIC 。這表明了微軟 DirectX 家族正更加組件化。Direct2D 以一種互補的方式對 DirectWrite 文本和 WIC 位圖操作提供硬件加速支持。

    最後想說的是,我們構建了一個支持硬件加速的 2D 渲染 API (帶有軟渲染)。它有着現代渲染原語集合,能和以前的 API 進行交互。我們認爲它完全可以取代作爲大多數應用程序開發場景所使用的 GDI/GDI+ API ,而且也可以作爲某些遊戲開發場景中 D3D 10.1 的補充。微軟構建的這麼一套組件化的技術集合完全允許開發人員混合搭配以構造以前難以構造的事物。比如把已定位的文本像素直接渲染到 Direct3D 紋理當中,而不需要任何字體的支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章