天天看點

linux-wayland-OpenGL關系-揭開Wayland的面紗(一):X Window的前生今世

鋒影

email:[email protected]

今天大家可能在“Wow! Ubuntu”或其他地方看到了這篇文章:Ubuntu 決定未來将啟用 Wayland X-Server。

Wayland是什麼呢?它是X Window?還是要取代X Window?它的優勢在哪裡?Linux桌面/移動會是以有什麼變化?在本篇中,我将回顧曆史,展望未來,通過簡易的文字,來先回顧一下X Window,進而繼續解答Wayland。

注:在下對X Window的了解僅限于表面,文章中會有不少技術、曆史方面的錯誤,若有大俠指出,不勝感激!

古老的X Window和現代的桌面技術

X Window在1984年由MIT研發,它的設計哲學之一是:提供機制,而非政策。舉個最簡單的例子吧:X Window提供了生成視窗(Window)的方法,但它沒規定視窗要怎麼呈現(map)或擺放(place),這個政策是由外部程式——視窗管理器(Window Manager)所決定的。另外一個X Window的主要特點便是:Server/Client網絡模型。不論是本地、遠端的應用程式,都統一通過Server/Client模型來運作,比如:讓遠端的應用程式跑在本地上。

X Window在推出之後快速演化,在1987年時候,其核心協定已經是第11版本了,簡稱:x11。這個版本已經将“提供機制,而非政策”這個哲學貫徹地非常徹底,以緻于核心協定基本穩定,不需要特别大的改動。于是乎,你看到了,現在是2010年,整整23年了,X Window依然是X11。

你可能會詫異,23年了,X Window的核心都沒有特别大的變化,它能适應現代桌面的快速發展嗎?這就要再次提到X Window的設計優勢了,X Window在核心層之外提供一個擴充層,開發者可以開發相應擴充,來實作自己的擴充協定,比方說:

标準的Window都是矩形的,我如何用它來畫一個圓形的視窗?X Window協定并未提供,但是通過“shape”這個擴充,X Window可以實作不規則的窗體。

是以啊,這23年,X Window除了繼續完善核心協定、驅動以外,很大程度上,都是擴充使它保持“與時俱進”,比如說:

  • 要多頭顯示支援,這個是由“Xinerama”擴充實作的;
  • 要有多媒體視訊回放的支援,這個是由“X Video”擴充實作的;
  • OpenGL的3D支援,則是通過“GL”擴充來實作的;
  • Compiz那樣的合成桌面特效是怎麼弄的?沒錯,還需要一個新的擴充,它便是:“Composite”;
  • 甚至Keyboard的支援,都是通過“X Keyboard Extension”(也就是“XKB”)的!

X Window的核心,基本上就是在處理Server/Client、驅動之類的,而外部的那些支援,基本上全是通過“擴充”進行的。這沒什麼不好,X Window的結構設計精良,盡管是擴充,但它們沒有任何效能上的問題。通過擴充友善地實作了一些對新技術、新事物的支援,而且友善維護,這再好不過了。

是以你看到了盡管23年過去了,基于X Window的GNOME、KDE,還能保持與同期Windows、Mac OS X競争甚至某些方面更好,你就不得不佩服這些前輩在最初設計時定下的設計哲學是多麼正确了。

雖然擴充的衆多沒有給X Window造成什麼問題,也跟X Window的設計哲學相符,但是其Server/Client的網絡構架,卻一直倍受質疑,這便是:

X Window的效率問題

經常聽到有人說,X Window的Server/Client結構嚴重影響效率,導緻Linux桌面的效應速度一直不如Windows、Mac OS X。事實是不是這樣呢?讓我們還是透過原理來說話吧。

這張,便是目前X Window系統的架構圖,稍微解釋一下:

  • X Client:圖形應用程式,如Firefox、Pidgin等;
  • X Server:你看不見的控制中心;
  • Compositor:合成桌面系統,如Compiz;
  • Kernel/KMS/evdev:這便是Linux Kernel,後面會提到KMS技術了,其中還有一項evdev,是管理輸入裝置的。
linux-wayland-OpenGL關系-揭開Wayland的面紗(一):X Window的前生今世

通過這些箭頭,你已經可以明白一些X Window的工作機制了,不過還從一個應用場景來解釋一下,想像一下,當你點選了Firefox(X Client)的“重新整理”按鈕,将會發生以下事情:

  1. 你用滑鼠點選了Firefox的“重新整理”按鈕,這時核心收到了滑鼠發來的事件,并将其通過evdev輸入驅動發送至了X Server。這時核心實際上做了很多事情,包括将不同品牌的滑鼠發出的不同信号轉換成了标準的“evdev”輸入資訊。
  2. 這時X Server可以判斷哪個Window該收到這個消息,并将某座标按下按鈕的消息發往X Client——Firefox。但事實上X Server并不知道它得到的視窗資訊是不是正确!為什麼呢?因為目前的Linux桌面早已經不是10年前的那樣了,現在是“Composite”即合成桌面的時代,合成桌面的一個特點便是:Compositor(如Compiz)管理視窗的一切,X Server隻能知道螢幕的某個點收到了滑鼠消息,卻不知道這個點下面到底有沒有視窗——誰知道Compiz是不是正在搞一個漂亮的、緩慢的動畫,把視窗收縮起來了呢?
  3. 假設應用場景沒這麼複雜,Firefox順利地收到了消息,這時Firefox要決定該如何做:按鈕要有按下的效果。于是Firefox再發送請求給X Server,說:“麻煩畫一下按鈕按下的效果。”
  4. 當X Server收到消息後,它就準備開始做具體的繪圖工作了:首先它告訴顯示卡驅動,要畫怎麼樣一個效果,然後它也計算了被改變的那塊區域,同時告訴Compiz那塊區域需要重新合成一下。
  5. Compiz收到消息後,它将從緩沖裡取得顯示卡渲染出的圖形并重新合成至整個螢幕——當然,Compiz的“合成”動作,也屬于“渲染(render)”,也是需要請求X Server,我要畫這塊,然後X Server回複:你可以畫了。
  6. 整個過程可能已經明了了,請求和渲染的動作,從X Client->X Server,再從X Server->Compositor,而且是雙向的,确實是比較耗時的,但是,事實還不是如此。介于X Window已有的機制,盡管Compiz已經掌管了全部最終桌面呈現的效果,但X Server在收到Compiz的“渲染”請求時,還會做一些“本職工作”,如:視窗的重疊判斷、被覆寫視窗的剪載計算等等(不然它怎麼知道滑鼠按下的坐标下,是Firefox的視窗呢)——這些都是無意義的重複工作,而且Compiz不會理會這些,Compiz依然會在自己的全螢幕“畫布”上,畫着自己的動畫效果……

從這個過程,基本可以得出結論:

  1. X Client <-> X Server <-> Compositor,這三者請求渲染的過程,不是很高效;
  2. X Server,Compositor,這兩者做了很多不必要的重複工作和正文切換。

當然,這裡我沒有直接說明這種模式有沒有給X Window造成效率問題,因為我們還少一個對照組。再看對照組之前,再來看看X Server的另一個趨勢:

從“什麼都做”到“做得越來越少”的X Window

X Window剛出現那會,主要提供一個在作業系統核心上的抽象層,來實作一個圖形環境。所謂圖形環境,最主要的便是:圖形+文字。當時的X Window便提供“繪圖”和“渲染文字”的機制。圖形桌面上的圖案和文字,都通過X Window合成并繪制出來。

一個典型的例子,如果你要用X來畫點,就要在你的程式中通過“XDrawPoint”來進行,X Server收到消息後,便會畫出相應的點。

現在,稍微接觸過圖形開發的人都知道了,在X Window下,一般都通過GTK+和Qt來進行了。更深一層的是,通過Cairo(Qt不是)來繪制圖形。Cairo是什麼?它是一個繪圖+渲染引擎,著名的浏覽器Firefox,便是使用Cairo來渲染網頁和文字的。

Cairo是一個全能的、跨平台的矢量繪圖庫,它不是簡單的包裝一下各個平台的繪圖庫而已,盡管它最初是基于X Window開發出來的繪圖庫。現在Cairo支援各種不同的後端,來向其輸出圖形,比如X、Windows的GDI、Mac OS X的Quartz,還有各種檔案格式:PNG、PDF,當然還有SVG。可以說,Cairo是一個很徹底的、全能的繪圖庫,現在無論繪制什麼圖形,都不會考慮到用XLib了。

在Cairo之上,還有文字排版庫:Pango,同樣很明顯的,處理文字排版,都不會用XFont之類的東西了,而是直接用Pango畫。當然Pango也是跨平台的。

盡管在Linux平台下,Cairo、Pango的發揮依然是基于X Window的,但X Window充其量僅僅是一個“backend”而已,并不是少它不行。同理,跨平台的GTK+、Qt也隻是視X為其中所支援的後端之一,假如哪天X真的不在了,更換一個新後端,目前的GNOME、KDE也能完整的跑起來。

再提另外一個比較典型的關于“X曾經做的,但現已不做”的例子,便是“模式設定(mode-setting)”,說通俗點,就是“分辨率的設定”,但後面會說明不僅僅如此。

大家都知道,Linux隻是一個核心,它隻有控制台,通過Shell來進行互動,而控制台預設是80x24(機關:字元)的,要進入分辨率1024x768或更高的圖形模式,就需要X進行一次“模式設定”,設定正确的分辨率等等。

盡管後來Linux也支援了各種使用者層(user-space)的模式設定,讓終端也支援标準的分辨率,但是X的模式設定與此是不相幹的,是以一兩年前,在Linux的啟動過程中,從終端進入圖形界面時,螢幕會“閃”一下,這時便在進行“模式設定”——這裡就一定要用“模式設定”這個術語了,因為即使終端是1024的,進入X圖形也是1024的,模式的變更還是要進行。

後來呢,嗯,2009年初期,KMS(核心模式設定)終于出現了!!!很少關心桌面圖形的Linux核心,在當時引入了“核心級”的模式設定,也就是說,在核心載入完畢、顯示驅動初始化後很短的時間内,即設定好标準的分辨率和色深,通過在X層做相應的更改,從此X的初始化就可以省去“模式設定”這一過程了!也就是從Fedora 10開始,Linux的啟動非常平滑、漂亮,沒有任何閃爍了。現在的Ubuntu 10.10也一樣,KMS的應用已經相當成熟。

X從此又少了一樣圖形任務……“X淚奔~你們都不要我了。”

可以說,這20多年來,X從“什麼都做”已經到了“做的越來越少”。絕大多數的開發者開發圖形應用程式,已經可以完全無視X的存在了,X現在更像是一個中間人的角色。那麼,X這個中間人會不會有一天,完全被其他事物所取代呢?

沒錯!它便是下篇要介紹的:Wayland!!!

繼續閱讀