? ? ? Wayland是什么呢?它是X Window?還是要取代X Window?它的優(yōu)勢(shì)在哪里?Linux桌面/移動(dòng)會(huì)因此有什么變化?在本篇中,我將回顧歷史,展望未來(lái),通過(guò)簡(jiǎn)易的文字,來(lái)先回顧一下X Window,從而繼續(xù)解答Wayland。
注:在下對(duì)X Window的理解僅限于表面,文章中會(huì)有不少技術(shù)、歷史方面的錯(cuò)誤,若有大俠指出,不勝感激!
古老的X Window和現(xiàn)代的桌面技術(shù)
X Window在1984年由MIT研發(fā),它的設(shè)計(jì)哲學(xué)之一是:提供機(jī)制,而非策略。舉個(gè)最簡(jiǎn)單的例子吧:X Window提供了生成窗口(Window)的方法,但它沒(méi)規(guī)定窗口要怎么呈現(xiàn)(map)或擺放(place),這個(gè)策略是由外部程序——窗口管理器(Window Manager)所決定的。另外一個(gè)X Window的主要特點(diǎn)便是:Server/Client網(wǎng)絡(luò)模型。不論是本地、遠(yuǎn)程的應(yīng)用程序,都統(tǒng)一通過(guò)Server/Client模型來(lái)運(yùn)作,比如:讓遠(yuǎn)程的應(yīng)用程序跑在本地上。
X Window在推出之后快速演化,在1987年時(shí)候,其核心協(xié)議已經(jīng)是第11版本了,簡(jiǎn)稱:x11。這個(gè)版本已經(jīng)將“提供機(jī)制,而非策略”這個(gè)哲學(xué)貫徹地非常徹底,以致于核心協(xié)議基本穩(wěn)定,不需要特別大的改動(dòng)。于是乎,你看到了,現(xiàn)在是2010年,整整23年了,X Window依然是X11。
你可能會(huì)詫異,23年了,X Window的核心都沒(méi)有特別大的變化,它能適應(yīng)現(xiàn)代桌面的快速發(fā)展嗎?這就要再次提到X Window的設(shè)計(jì)優(yōu)勢(shì)了,X Window在核心層之外提供一個(gè)擴(kuò)展層,開(kāi)發(fā)者可以開(kāi)發(fā)相應(yīng)擴(kuò)展,來(lái)實(shí)現(xiàn)自己的擴(kuò)展協(xié)議,比方說(shuō):
標(biāo)準(zhǔn)的Window都是矩形的,我如何用它來(lái)畫一個(gè)圓形的窗口?X Window協(xié)議并未提供,但是通過(guò)“shape”這個(gè)擴(kuò)展,X Window可以實(shí)現(xiàn)不規(guī)則的窗體。
所以啊,這23年,X Window除了繼續(xù)完善核心協(xié)議、驅(qū)動(dòng)以外,很大程度上,都是擴(kuò)展使它保持“與時(shí)俱進(jìn)”,比如說(shuō):
要多頭顯示支持,這個(gè)是由“Xinerama”擴(kuò)展實(shí)現(xiàn)的;
要有多媒體視頻回放的支持,這個(gè)是由“X Video”擴(kuò)展實(shí)現(xiàn)的;
OpenGL的3D支持,則是通過(guò)“GL”擴(kuò)展來(lái)實(shí)現(xiàn)的;
Compiz那樣的合成桌面特效是怎么弄的?沒(méi)錯(cuò),還需要一個(gè)新的擴(kuò)展,它便是:“Composite”;
甚至Keyboard的支持,都是通過(guò)“X Keyboard Extension”(也就是“XKB”)的!
X Window的核心,基本上就是在處理Server/Client、驅(qū)動(dòng)之類的,而外部的那些支持,基本上全是通過(guò)“擴(kuò)展”進(jìn)行的。這沒(méi)什么不好,X Window的結(jié)構(gòu)設(shè)計(jì)精良,盡管是擴(kuò)展,但它們沒(méi)有任何效能上的問(wèn)題。通過(guò)擴(kuò)展方便地實(shí)現(xiàn)了一些對(duì)新技術(shù)、新事物的支持,而且方便維護(hù),這再好不過(guò)了。
所以你看到了盡管23年過(guò)去了,基于X Window的GNOME、KDE,還能保持與同期Windows、Mac OS X競(jìng)爭(zhēng)甚至某些方面更好,你就不得不佩服這些前輩在最初設(shè)計(jì)時(shí)定下的設(shè)計(jì)哲學(xué)是多么正確了。
雖然擴(kuò)展的眾多沒(méi)有給X Window造成什么問(wèn)題,也跟X Window的設(shè)計(jì)哲學(xué)相符,但是其Server/Client的網(wǎng)絡(luò)構(gòu)架,卻一直倍受質(zhì)疑,這便是:
X Window的效率問(wèn)題
經(jīng)常聽(tīng)到有人說(shuō),X Window的Server/Client結(jié)構(gòu)嚴(yán)重影響效率,導(dǎo)致Linux桌面的效應(yīng)速度一直不如Windows、Mac OS X。事實(shí)是不是這樣呢?讓我們還是透過(guò)原理來(lái)說(shuō)話吧。
這張,便是當(dāng)前X Window系統(tǒng)的架構(gòu)圖,稍微解釋一下:
X Client:圖形應(yīng)用程序,如Firefox、Pidgin等;
X Server:你看不見(jiàn)的控制中心;
Compositor:合成桌面系統(tǒng),如Compiz;
Kernel/KMS/evdev:這便是Linux Kernel,后面會(huì)提到KMS技術(shù)了,其中還有一項(xiàng)evdev,是管理輸入設(shè)備的。
通過(guò)這些箭頭,你已經(jīng)可以明白一些X Window的工作機(jī)制了,不過(guò)還從一個(gè)應(yīng)用場(chǎng)景來(lái)解釋一下,想像一下,當(dāng)你點(diǎn)擊了Firefox(X Client)的“刷新”按鈕,將會(huì)發(fā)生以下事情:
你用鼠標(biāo)點(diǎn)擊了Firefox的“刷新”按鈕,這時(shí)內(nèi)核收到了鼠標(biāo)發(fā)來(lái)的事件,并將其通過(guò)evdev輸入驅(qū)動(dòng)發(fā)送至了X Server。這時(shí)內(nèi)核實(shí)際上做了很多事情,包括將不同品牌的鼠標(biāo)發(fā)出的不同信號(hào)轉(zhuǎn)換成了標(biāo)準(zhǔn)的“evdev”輸入信息。
這時(shí)X Server可以判斷哪個(gè)Window該收到這個(gè)消息,并將某座標(biāo)按下按鈕的消息發(fā)往X Client——Firefox。但事實(shí)上X Server并不知道它得到的窗口信息是不是正確!為什么呢?因?yàn)楫?dāng)前的Linux桌面早已經(jīng)不是10年前的那樣了,現(xiàn)在是“Composite”即合成桌面的時(shí)代,合成桌面的一個(gè)特點(diǎn)便是:Compositor(如Compiz)管理窗口的一切,X Server只能知道屏幕的某個(gè)點(diǎn)收到了鼠標(biāo)消息,卻不知道這個(gè)點(diǎn)下面到底有沒(méi)有窗口——誰(shuí)知道Compiz是不是正在搞一個(gè)漂亮的、緩慢的動(dòng)畫,把窗口收縮起來(lái)了呢?
假設(shè)應(yīng)用場(chǎng)景沒(méi)這么復(fù)雜,F(xiàn)irefox順利地收到了消息,這時(shí)Firefox要決定該如何做:按鈕要有按下的效果。于是Firefox再發(fā)送請(qǐng)求給X Server,說(shuō):“麻煩畫一下按鈕按下的效果?!?/p>
當(dāng)X Server收到消息后,它就準(zhǔn)備開(kāi)始做具體的繪圖工作了:首先它告訴顯卡驅(qū)動(dòng),要畫怎么樣一個(gè)效果,然后它也計(jì)算了被改變的那塊區(qū)域,同時(shí)告訴Compiz那塊區(qū)域需要重新合成一下。
Compiz收到消息后,它將從緩沖里取得顯卡渲染出的圖形并重新合成至整個(gè)屏幕——當(dāng)然,Compiz的“合成”動(dòng)作,也屬于“渲染(render)”,也是需要請(qǐng)求X Server,我要畫這塊,然后X Server回復(fù):你可以畫了。
整個(gè)過(guò)程可能已經(jīng)明了了,請(qǐng)求和渲染的動(dòng)作,從X Client->X Server,再?gòu)腦 Server->Compositor,而且是雙向的,確實(shí)是比較耗時(shí)的,但是,事實(shí)還不是如此。介于X Window已有的機(jī)制,盡管Compiz已經(jīng)掌管了全部最終桌面呈現(xiàn)的效果,但X Server在收到Compiz的“渲染”請(qǐng)求時(shí),還會(huì)做一些“本職工作”,如:窗口的重疊判斷、被覆蓋窗口的剪載計(jì)算等等(不然它怎么知道鼠標(biāo)按下的坐標(biāo)下,是Firefox的窗口呢)——這些都是無(wú)意義的重復(fù)工作,而且Compiz不會(huì)理會(huì)這些,Compiz依然會(huì)在自己的全屏幕“畫布”上,畫著自己的動(dòng)畫效果……
從這個(gè)過(guò)程,基本可以得出結(jié)論:
X Client <-> X Server <-> Compositor,這三者請(qǐng)求渲染的過(guò)程,不是很高效;
X Server,Compositor,這兩者做了很多不必要的重復(fù)工作和正文切換。
當(dāng)然,這里我沒(méi)有直接說(shuō)明這種模式有沒(méi)有給X Window造成效率問(wèn)題,因?yàn)槲覀冞€少一個(gè)對(duì)照組。再看對(duì)照組之前,再來(lái)看看X Server的另一個(gè)趨勢(shì):
從“什么都做”到“做得越來(lái)越少”的X Window
X Window剛出現(xiàn)那會(huì),主要提供一個(gè)在操作系統(tǒng)內(nèi)核上的抽象層,來(lái)實(shí)現(xiàn)一個(gè)圖形環(huán)境。所謂圖形環(huán)境,最主要的便是:圖形+文字。當(dāng)時(shí)的X Window便提供“繪圖”和“渲染文字”的機(jī)制。圖形桌面上的圖案和文字,都通過(guò)X Window合成并繪制出來(lái)。
一個(gè)典型的例子,如果你要用X來(lái)畫點(diǎn),就要在你的程序中通過(guò)“XDrawPoint”來(lái)進(jìn)行,X Server收到消息后,便會(huì)畫出相應(yīng)的點(diǎn)。
現(xiàn)在,稍微接觸過(guò)圖形開(kāi)發(fā)的人都知道了,在X Window下,一般都通過(guò)GTK+和Qt來(lái)進(jìn)行了。更深一層的是,通過(guò)Cairo(Qt不是)來(lái)繪制圖形。Cairo是什么?它是一個(gè)繪圖+渲染引擎,著名的瀏覽器Firefox,便是使用Cairo來(lái)渲染網(wǎng)頁(yè)和文字的。
Cairo是一個(gè)全能的、跨平臺(tái)的矢量繪圖庫(kù),它不是簡(jiǎn)單的包裝一下各個(gè)平臺(tái)的繪圖庫(kù)而已,盡管它最初是基于X Window開(kāi)發(fā)出來(lái)的繪圖庫(kù)。現(xiàn)在Cairo支持各種不同的后端,來(lái)向其輸出圖形,比如X、Windows的GDI、Mac OS X的Quartz,還有各種文件格式:PNG、PDF,當(dāng)然還有SVG??梢哉f(shuō),Cairo是一個(gè)很徹底的、全能的繪圖庫(kù),現(xiàn)在無(wú)論繪制什么圖形,都不會(huì)考慮到用XLib了。
在Cairo之上,還有文字排版庫(kù):Pango,同樣很明顯的,處理文字排版,都不會(huì)用XFont之類的東西了,而是直接用Pango畫。當(dāng)然Pango也是跨平臺(tái)的。
盡管在Linux平臺(tái)下,Cairo、Pango的發(fā)揮依然是基于X Window的,但X Window充其量?jī)H僅是一個(gè)“backend”而已,并不是少它不行。同理,跨平臺(tái)的GTK+、Qt也只是視X為其中所支持的后端之一,假如哪天X真的不在了,更換一個(gè)新后端,當(dāng)前的GNOME、KDE也能完整的跑起來(lái)。
再提另外一個(gè)比較典型的關(guān)于“X曾經(jīng)做的,但現(xiàn)已不做”的例子,便是“模式設(shè)置(mode-setting)”,說(shuō)通俗點(diǎn),就是“分辨率的設(shè)置”,但后面會(huì)說(shuō)明不僅僅如此。
大家都知道,Linux只是一個(gè)內(nèi)核,它只有控制臺(tái),通過(guò)Shell來(lái)進(jìn)行交互,而控制臺(tái)默認(rèn)是80x24(單位:字符)的,要進(jìn)入分辨率1024x768或更高的圖形模式,就需要X進(jìn)行一次“模式設(shè)置”,設(shè)置正確的分辨率等等。
盡管后來(lái)Linux也支持了各種用戶層(user-space)的模式設(shè)置,讓終端也支持標(biāo)準(zhǔn)的分辨率,但是X的模式設(shè)置與此是不相干的,所以一兩年前,在Linux的啟動(dòng)過(guò)程中,從終端進(jìn)入圖形界面時(shí),屏幕會(huì)“閃”一下,這時(shí)便在進(jìn)行“模式設(shè)置”——這里就一定要用“模式設(shè)置”這個(gè)術(shù)語(yǔ)了,因?yàn)榧词菇K端是1024的,進(jìn)入X圖形也是1024的,模式的變更還是要進(jìn)行。
后來(lái)呢,嗯,2009年初期,KMS(內(nèi)核模式設(shè)置)終于出現(xiàn)了?。?!很少關(guān)心桌面圖形的Linux內(nèi)核,在當(dāng)時(shí)引入了“內(nèi)核級(jí)”的模式設(shè)置,也就是說(shuō),在內(nèi)核載入完畢、顯示驅(qū)動(dòng)初始化后很短的時(shí)間內(nèi),即設(shè)置好標(biāo)準(zhǔn)的分辨率和色深,通過(guò)在X層做相應(yīng)的更改,從此X的初始化就可以省去“模式設(shè)置”這一過(guò)程了!也就是從Fedora 10開(kāi)始,Linux的啟動(dòng)非常平滑、漂亮,沒(méi)有任何閃爍了?,F(xiàn)在的Ubuntu 10.10也一樣,KMS的應(yīng)用已經(jīng)相當(dāng)成熟。
X從此又少了一樣圖形任務(wù)……“X淚奔~你們都不要我了?!?/p>
可以說(shuō),這20多年來(lái),X從“什么都做”已經(jīng)到了“做的越來(lái)越少”。絕大多數(shù)的開(kāi)發(fā)者開(kāi)發(fā)圖形應(yīng)用程序,已經(jīng)可以完全無(wú)視X的存在了,X現(xiàn)在更像是一個(gè)中間人的角色。那么,X這個(gè)中間人會(huì)不會(huì)有一天,完全被其他事物所取代呢?
?
評(píng)論