Windows7的圖形架構與DX的那點事

來源:互聯網
上載者:User

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

一:

原文連結 : 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 紋理當中,而不需要任何字型的支援。

二:

深度解讀 - 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 的結合越來越緊密。

雖然人們經常可以聽到 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 系統
聯合顯示適配器(又叫聯合渲染)

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


Windows 7 核心圖形架構

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


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

 
XPDM :非合成模型

 
WDDM :合成模型

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

 

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

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

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

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


Windows XP 的Direct3D/GDI驅動架構


Windows Vista 核心圖形架構,比起 XP 來要豐富了很多

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

以前的圖形操作大部分由 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 是硬體加速的。

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


字型消除鋸齒: DirectWrite 效果


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 之上。

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

顯示技術  

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

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

 
WDDM 1.1 要求驅動支援 BGRA BGRA 是最快的色彩格式

顯示裝置串連和配置  


Windows 7 中,所有的應用程式都在一個統一的虛擬桌面中顯示,這個虛擬桌面解析度為 64Kx64K 65536x65536

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


不過,在 Vista 下,無法使用多塊不同 GPU 廠商的顯卡,而 Windows 7 則可以  

在 LDA 配置下,程式介面在不同的輸出中漫遊基本上是透明的,叫做 Dynamic adapterswitching 動態配接器切換

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

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.