嵌入式Linux系統(tǒng)圖形及圖形用戶界面
當(dāng)然,因?yàn)椴煌娘@示芯片具有不同的加速能力,對(duì)memio 的使用和定義也各自不同,這時(shí),就需要針對(duì)加速芯片的不同類型來(lái)編寫實(shí)現(xiàn)不同的加速功能。比如大多數(shù)芯片都提供了對(duì)矩形填充的硬件加速支持,但不同的芯片實(shí)現(xiàn)方式不同,這時(shí),就需要針對(duì)不同的芯片類型編寫不同的用來(lái)完成填充矩形的函數(shù)。
說(shuō)到這里,讀者可能已經(jīng)意識(shí)到 FrameBuffer 只是一個(gè)提供顯示內(nèi)存和顯示芯片寄存器從物理內(nèi)存映射到進(jìn)程地址空間中的設(shè)備。所以,對(duì)于應(yīng)用程序而言,如果希望在 FrameBuffer 之上進(jìn)行圖形編程,還需要完成其他許多工作。舉個(gè)例子來(lái)講,F(xiàn)rameBuffer 就像一張畫布,使用什么樣子的畫筆,如何畫畫,還需要你自己動(dòng)手完成。
1.4 LibGGI
LibGGI 試圖建立一個(gè)一般性的圖形接口,而這個(gè)抽象接口連同相關(guān)的輸入(鼠標(biāo)、鍵盤、游戲桿等)抽象接口一起,可以方便地運(yùn)行在 X Window、SVGALib、FrameBuffer 等等之上。建立在 LibGGI 之上的應(yīng)用程序,不經(jīng)重新編譯,就可以在上述這些底層圖形接口上運(yùn)行。但不知何故,LibGGI 的發(fā)展幾乎停滯。
2 Linux 圖形領(lǐng)域的高級(jí)函數(shù)庫(kù)
2.1 Xlib 及其他相關(guān)函數(shù)庫(kù)
在 X Window 系統(tǒng)中進(jìn)行圖形編程時(shí),可以選擇直接使用 Xlib。Xlib 實(shí)際是對(duì)底層 X 協(xié)議的封裝,可通過該函數(shù)庫(kù)進(jìn)行一般的圖形輸出。如果你的 X Server 支持 DGA,則可以通過 DGA 擴(kuò)展直接訪問顯示設(shè)備,從而獲得加速支持。對(duì)一般用戶而言,由于 Xlib 的接口太原始而且復(fù)雜,因此一般的圖形程序選擇其他高級(jí)一些的圖形庫(kù)作為基礎(chǔ)。比如,GTK、QT 等等。這兩個(gè)函數(shù)同時(shí)還是一些高級(jí)的圖形用戶界面支持函數(shù)庫(kù)。由于種種原因,GTK、QT 等函數(shù)庫(kù)存在有龐大、占用系統(tǒng)資源多的問題,不太適合在嵌入式系統(tǒng)中使用。這時(shí),你可以選擇使用 FLTK,這是一個(gè)輕量級(jí)的圖形函數(shù)庫(kù),但它的主要功能集中在用戶界面上,提供了較為豐富的控件集。
2.2 SDL
SDL(Simple DirectMedia Layer)是一個(gè)跨平臺(tái)的多媒體游戲支持庫(kù)。其中包含了對(duì)圖形、聲音、游戲桿、線程等等的支持,目前可以運(yùn)行在許多平臺(tái)上,其中包括 X Window、X Window with DGA、Linux FrameBuffer 控制臺(tái)、Linux SVGALib,以及Windows DirectX、BeOS 等等。
因?yàn)?SDL 專門為游戲和多媒體應(yīng)用而設(shè)計(jì)開發(fā),所以它對(duì)圖形的支持非常優(yōu)秀,尤其是高級(jí)圖形能力,比如 Alpha 混和、透明處理、YUV 覆蓋、Gamma 校正等等。而且在 SDL 環(huán)境中能夠非常方便地加載支持 OpenGL 的 Mesa 庫(kù),從而提供對(duì)二維和三維圖形的支持。
可以說(shuō),SDL 是編寫跨平臺(tái)游戲和多媒體應(yīng)用的最佳平臺(tái),也的確得到了廣泛應(yīng)用。
2.3 Allegro
Allegro 是一個(gè)專門為 x86 平臺(tái)設(shè)計(jì)的游戲圖形庫(kù)。最初的 Allegro 運(yùn)行在 DOS 環(huán)境下,而目前可運(yùn)行在 Linux FrameBuffe 控制臺(tái)、Linux SVGALib、X Window 等系統(tǒng)上。Allegro 提供了一些豐富的圖形功能,包括矩形填充和樣條曲線生成等等,而且具有較好的三維圖形顯示能力。由于 Allegro 的許多關(guān)鍵代碼是采用匯編編寫的,所以該函數(shù)庫(kù)具有運(yùn)行速度快、資源占用少的特點(diǎn)。然而,Allegro 也存在如下缺點(diǎn):
1)對(duì)線程的支持較差。Allegro 的許多函數(shù)是非線程安全的,不能同時(shí)在兩個(gè)以上的線程中使用。
2)對(duì)硬件加速能力的支持不足,在設(shè)計(jì)上沒有為硬件加速提供接口。
2.4 Mesa3D
Mesa3D 是一個(gè)兼容 OpenGL 規(guī)范的開放源碼函數(shù)庫(kù),是目前 Linux 上提供專業(yè)三維圖形支持的惟一選擇。Mesa3D 同時(shí)也是一個(gè)跨平臺(tái)的函數(shù)庫(kù),能夠運(yùn)行在 X Window、X Window with DGA、BeOS、Linux SVGALib 等平臺(tái)上。
2.5 DirectFB
DirectFB 是專注于 Linux FrameBuffer 加速的一個(gè)圖形庫(kù),并試圖建立一個(gè)兼容 GTK 的嵌入式 GUI 系統(tǒng)。它以可裝載函數(shù)庫(kù)的形勢(shì)提供對(duì)加速 FrameBuffer 驅(qū)動(dòng)程序的支持。目前,該函數(shù)庫(kù)正在開發(fā)之中(最新版本 0.9.97),詳情可見 http://www.directfb.org/。
3.1 MicoroWindows/NanoX
MicroWindows(http: //microwindows.censoft.com)是一個(gè)開放源碼的項(xiàng)目,目前由美國(guó) Century Software 公司主持開發(fā)。該項(xiàng)目的開發(fā)一度非常活躍,國(guó)內(nèi)也有人參與了其中的開發(fā),并編寫了 GB2312 等字符集的支持。但在 Qt/Embedded 發(fā)布以來(lái),該項(xiàng)目變得不太活躍,并長(zhǎng)時(shí)間停留在 0.89Pre7 版本。可以說(shuō),以開放源碼形勢(shì)發(fā)展的 MicroWindows 項(xiàng)目,基本停滯。
MicroWindows 是一個(gè)基于典型客戶/服務(wù)器體系結(jié)構(gòu)的 GUI 系統(tǒng),基本分為三層。最底層是面向圖形輸出和鍵盤、鼠標(biāo)或觸摸屏的驅(qū)動(dòng)程序;中間層提供底層硬件的抽象接口,并進(jìn)行窗口管理;最高層分別提供兼容于 X Window 和 Windows CE(Win32 子集)的 API。
該項(xiàng)目的主要特色在于提供了類似 X 的客戶/服務(wù)器體系結(jié)構(gòu),并提供了相對(duì)完善的圖形功能,包括一些高級(jí)的功能,比如 Alpha 混合,三維支持,TrueType 字體支持等。但需要注意的是,MicroWindows 的圖形引擎存在許多問題,可以歸納如下:
1)無(wú)任何硬件加速能力。
2)圖形引擎中存在許多低效算法,同時(shí)未經(jīng)任何優(yōu)化。比如在直線或者圓弧繪圖函數(shù)中,存在低效的逐點(diǎn)判斷剪切的問題。
3)代碼質(zhì)量較差。由于該項(xiàng)目缺少一個(gè)強(qiáng)有力的核心代碼維護(hù)人員,因此代碼質(zhì)量參差不齊,影響整體系統(tǒng)穩(wěn)定性。這也是 MicroWindows 長(zhǎng)時(shí)間停留在 0.89Pre7 版本上的原因。
MicroWindows 采用 MPL 條款發(fā)布(該條款基本類似 LGPL 條款)。
3.2 OpenGUI
OpenGUI(http://www.tutok.sk/fastgl/)在 Linux 系統(tǒng)上存在已經(jīng)很長(zhǎng)時(shí)間了。最初的名字叫 FastGL,只支持 256 色的線性顯存模式,但目前也支持其他顯示模式,并且支持多種操作系統(tǒng)平臺(tái),比如 MS-DOS、QNX 和 Linux 等等,不過目前只支持 x86 硬件平臺(tái)。OpenGUI 也分為三層。最低層是由匯編編寫的快速圖形引擎;中間層提供了圖形繪制 API,包括線條、矩形、圓弧等,并且兼容于 Borland 的 BGI API。第三層用 C++ 編寫,提供了完整的 GUI 對(duì)象集。
OpenGUI 采用 LGPL 條款發(fā)布。OpenGUI 比較適合于基于 x86 平臺(tái)的實(shí)時(shí)系統(tǒng),可移植性稍差,目前的發(fā)展也基本停滯。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
評(píng)論