接下來我們終於要再次進入 2006、2007 年這具有傳奇意義且幾乎可說是奠定了未來十幾年個人電腦基礎的年份了,在這一年當中發生最重要的事情就是 Vista 的完工與上市,不論後來人們如何評斷 Windows Vista 的不流暢與「華而不實」,事實上從 2006 以降的所有 Windows 版本實際上其實都是以 Vista 為基礎下去微調出來的產品!要說微軟在 2006 年之後在作業系統技術面就沒有真正重大的架構革新其實也不為過。

Windows Vista 的變革

回顧當年 Windows Vista 帶來的改變其實絕大多數都是內外兼具的,外觀上的變化有非常大部分奠基於內部架構的徹底革新,像是為了創造用起來仍然讓人充滿熟悉感卻骨子裡已全然不同的桌面環境,只好把整個桌面渲染機制與顯示卡記憶體堆疊砍掉重練,又因此為了大幅提高的繪圖性能需求,只好把整個 Shader Model 規劃也砍掉重練,甚至連用了好幾年的可程式化繪圖管線的架構都升級到新的統一渲染器架構了。

Desktop Window Manager (DWM)

相信絕大多數人至今對 Windows Vista 留有最多印象的部分就是被稱之為 Windows Aero 的磨砂玻璃特效介面了吧?實際上這項功能真正的幕後功臣就是 Desktop Window Manager,單從桌面視窗管理員這名字上來說可能不太好理解這是甚麼東西,實際上在早期的 Longhorn 版本當中 DWM 曾經被稱為 Desktop Compositing Engine (桌面合成引擎,DCE),從這名稱應該就不難理解其實 DWM 負責的就是將各視窗的即時繪圖合成為我們所見到的桌面環境的功能。

ssm6505

如果你是從 XP 或更早以前開始用電腦的話,應該對上面這張經典畫面不陌生吧?在 Windows 3.1 到 Windows XP 之前基本上 Windows 用來渲染桌面的機制都大同小異,也就是我在好幾篇前曾經介紹過的 GDI 與後來的 GDI+,當時 Windows 桌面是純粹的 2D 圖形組成,也就是直接將畫面進行渲染與輸出,在遇到有重疊視窗的時候才透過每個部分的 Z 軸值大小來判斷是否被遮住,將被遮住的部分挑出來不予渲染的方式來達成視窗重疊的效果的,不過這樣的作法意味著在上方視窗移動的時候,下面全部的視窗也都得跟著被重畫一次,而在渲染速度比視窗移動速度還要慢的時候,電腦會來不及去除正確的重疊部分,最後的結果就是像上圖那樣的殘影。

sad9143

而且除了殘影問題經常發生之外,過去十年間實際上電腦的性能幾乎是直線上升的,穩定的一年一代,每年有更新、每代有升級讓人們對於未來電腦的前景實際上是比較有信心的,因此也有不少人開始思考,從 1994 年一路用到現在的 GDI 是時候該來點大改版了吧?3D 圖形都發展這麼久了,桌面環境為什麼不能 3D 化呢?有如水晶一般的半透明畫面不是很動人嗎?我們的顯示卡這麼強大了,為什麼在不玩遊戲的時候要讓顯示卡閒著呢?這些想法逐漸浮上了檯面,於是就有了這一系列的變革誕生 (實際上第一個弄出這類介面風格與類似架構設計的是蘋果的 Mac OS X)。

xps1023

至於 DWM 是怎麼解決這個問題的呢?從上面這張示意圖應該就不難理解了,在進入 DWM 時代之後 Windows 會將每個程式的視窗繪製到專屬的虛擬空間中,再交給 DWM 進行合成處理以產生最後我們所看到的桌面環境,這意味著不論桌面上的東西怎麼移動,都不需要重新渲染視窗的內容,自然也就不可能再產生殘影的問題,而且還讓很多本來不可能實現的特效成為可能 (當然由於要渲染的東西多很多,性能方面的需求也跟著拉高了很多)。

ape1941

最鮮明的例子應該就是 Aero Glass 處理視窗重疊的做法了,注意上圖當中的兩個視窗,上層視窗的標題列有微微透出下層控制台視窗中的文字,在以往的 GDI 架構當中這是不可能出現的情況,理由很簡單,傳統 GDI 在這種情況下根本不會去渲染下層視窗被蓋住的部分,因此根本也無從得知下層視窗長甚麼樣子,更別說缺乏對 Direct3D API 的支援因此實際上根本也沒辦法即時算出玻璃的高斯模糊特效這件事情了。

ase1031

上圖當中的 3D Flip 應該是 Vista 當時宣傳上最具代表性的畫面吧?儘管被認為非常雞肋,但實際上這個功能可以說是 DWM 最好的技術展示,同時展現了 DWM 的預渲染畫面即時映射能力與桌面環境 3D 化並將 DirectX 帶入桌面環境中的設計精神。

Windows Display Driver Model (WDDM)

如同 GDI 在 Windows Vista 以前扮演了在 User Mode 執行的應用程式與嵌入 Kernel Mode 的驅動程式之間溝通橋樑的角色 (下圖) 一般,這個角色由 DWM 接手之後自然在驅動程式的架構方面也得迎來一次大翻新才行,Windows 顯示驅動模型 (WDDM) 就是為此而設計的。

xsp8508

在開始看 WDDM 的設計之前我們得先從 Windows XP 時代或更早以前的 Windows 顯示驅動程式架構開始看起 (微軟將其稱之為 Windows XP Display Driver Model, XPDM),從架構上可以很明顯看出來負責 2D 桌面環境的 GDI 與負責 3D 圖形程式的 Direct3D 實際上是完全被拆分成兩個部分處理的,彼此之間井水不犯河水 (實際上微軟也不是沒有想過把他們硬是融合起來,不過後來發現落差實在太大而始終沒辦法達成),而且全部都在 Kernel Mode 中。

xsm4787

而在進入 Windows Vista 之後,由於桌面環境在升級到 DWM 架構之後實際上也變成 (廣義上的) 3D 應用程式了 (甚至新式程式的圖形介面使用 Windows Presentation Framework, WPF 本來就是 Direct3D 程式),因此全部通通交給 DirectX Runtime 負責處理就行 (但為了繼續支援傳統程式還是得顧慮到傳統 GDI 的部分,作法上是透過 WMF 包裝之後由 DWM 來繼續提供相容性,有點像是把每個 GDI 程式獨立隔開變成數個執行個體來轉換處理,之後與其他 Direct3D 程式一樣把渲染的結果扔給 DWM 做合成,當然這麼做的代價就是在 Vista 上 GDI 是沒有支援硬體加速的,這導致 Vista 在處理傳統 GDI 程式的性能受到了不小的影響,這某種程度上是 Vista 的 WDDM 一開始為人所詬病的主要原因之一,因為在這種狀況下 Vista 的表現反而會比 XP 糟糕,而偏偏在 Vista 誕生的時間點基於 GDI 的程式遠比支援 WPF 的來得多,於是災難就無可避免的發生了,但這點之後在 Windows 7 上這點有被修正,也許之後有機會會提到)。

sdp7787

  • Sosiris Tseng

    個人淺見:
    1. OpenCL也比較難寫(光前置作業就要幾十行代碼)。OpenCL雖然代碼跨平台,但是效能沒有,還是得根據硬體架構來寫才能榨乾它(先不論CPU vs GPU的kernel, GCN架構之前跟之後的ATI卡 kernel寫法就會有所差異)

    2.雖然一窩蜂的挖比特幣造成不少能源消耗,但也讓大家認識區塊鍊技術,不失為一件好事 (對了站長,改天要不要發一篇關於區塊鍊技術的文章?)