国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

嵌入式 Linux 系統(tǒng)圖形及圖形用戶界面綜述

2024-07-21 02:37:01
字體:
供稿:網(wǎng)友

  作者:魏永明
  
  目錄
  1 linux 圖形領(lǐng)域的基礎(chǔ)設(shè)施
  1.1 X Window
  1.2 SVGALib
  1.3 FrameBuffer
  1.4 LibGGI
  2 Linux 圖形領(lǐng)域的高級函數(shù)庫
  2.1 Xlib 及其他相關(guān)函數(shù)庫
  2.2 SDL
  2.3 Allegro
  2.4 Mesa3D
  2.5 DirectFB
  3 面向嵌入式Linux 系統(tǒng)的圖形用戶界面
  3.1 MicroWindows/NanoX
  3.2 OpenGUI
  3.3 Qt/Embedded
  3.4 MiniGUI
  4 小結(jié)
  
  
  本文首先概述了 Linux 圖形領(lǐng)域的基本設(shè)施,然后描述了一些可供嵌入式 Linux 系統(tǒng)使用的高級圖形庫以及圖形用戶界面支持系統(tǒng)。希望對嵌入式 Linux 系統(tǒng)的開發(fā)有所幫助。
  
  
  1 Linux 圖形領(lǐng)域的基礎(chǔ)設(shè)施
  
  本小節(jié)首先向讀者描述 Linux 圖形領(lǐng)域中常見的基礎(chǔ)設(shè)施。之所以稱為基礎(chǔ)設(shè)施,是因?yàn)檫@些系統(tǒng)(或者函數(shù)庫),一般作為其他高級圖形或者圖形應(yīng)用程序的基本函數(shù)庫。這些系統(tǒng)(或者函數(shù)庫)包括:X Window、SVGALib、FrameBuffer 等等。
  
  1.1 X Window
  
  提起 Linux 上的圖形,許多人首先想到的是 X Window。這一系統(tǒng)是目前類 UNIX 系統(tǒng)中處于控制地位的桌面圖形系統(tǒng)。無疑,X Window 作為一個(gè)圖形環(huán)境是成功的,它上面運(yùn)行著包括 CAD建模工具和辦公套件在內(nèi)的大量應(yīng)用程序。但必須看到的是,由于 X Window 在體系接口上的原因,限制了其對游戲、多媒體的支持能力。用戶在 X Window 上運(yùn)行 VCD 播放器,或者運(yùn)行一些大型的三維游戲時(shí),經(jīng)常會發(fā)現(xiàn)同樣的硬件配置,卻不能獲得和 Windows 操作系統(tǒng)一樣的圖形效果――即使使用了加速的 X Server,其效果也不能令人滿足。另外,大型的應(yīng)用程序(比如 Mozilla 瀏覽器)在 X Window 上運(yùn)行時(shí)的響應(yīng)能力,也相當(dāng)不能令人滿足。當(dāng)然,這里有 Linux 內(nèi)核在進(jìn)程調(diào)度上的問題,也有 X Window 的原因。
  
  X Window 為了滿足對游戲、多媒體等應(yīng)用對圖形加速能力的要求,提供了 DGA(直接圖形訪問)擴(kuò)展,通過該擴(kuò)展,應(yīng)用程序可以在全屏模式下直接訪問顯示卡的幀緩沖區(qū),并能夠提供對某些加速功能的支持。
  
  1.2 SVGALib
  
  SVGALib 是 Linux 系統(tǒng)中最早出現(xiàn)的非 X 圖形支持庫。這個(gè)庫從最初對標(biāo)準(zhǔn) VGA 兼容芯片的支持開始,一直發(fā)展到對老式 SVGA 芯片的支持以及對現(xiàn)今流行的高級視頻芯片的支持。它為用戶提供了在控制臺上進(jìn)行圖形編程的接口,使用戶可以在 PC 兼容系統(tǒng)上方便地獲得圖形支持。但該系統(tǒng)有如下不足:
  
  1)接口雜亂。SVGALib 從最初的 vgalib 發(fā)展而來,保留了老系統(tǒng)的許多接口,而這些接口卻不能良好地迎合新顯示芯片的圖形能力。
  2)未能較好地隱藏硬件細(xì)節(jié)。許多操作,不能自動使用顯示芯片的加速能力支持。
  3)可移植性差。SVGALib 目前只能運(yùn)行在 x86 平臺上,對其他平臺的支持能力較差(Alpha 平臺除外)。
  4)發(fā)展緩慢,有被其他圖形庫取代的可能。SVGALib 作為一個(gè)老的圖形支持庫,目前的應(yīng)用范圍越來越小,尤其在 Linux 內(nèi)核增加了 FrameBuffer 驅(qū)動支持之后,有逐漸被其他圖形庫替代的跡象。
  5)對應(yīng)用的支持能力較差。SVAGLib 作為一個(gè)圖形庫,對高級圖形功能的支持,比如直線和曲線等等,卻不能令人滿足。盡管 SVGALib 有許多缺點(diǎn),但 SVGALib 經(jīng)常被其他圖形庫用來初始化特定芯片的顯示模式,并獲得映射到進(jìn)程地址空間的線性顯示內(nèi)存首地址(即幀緩沖區(qū)),而其他的接口卻很少用到。另外,SVGALib 中所包含的諸如鍵盤、鼠標(biāo)和游戲桿的接口,也很少被其他應(yīng)用程序所使用。

  
  因此,SVGALib 的使用越來越少,筆者也不建議用戶使用這個(gè)圖形庫。當(dāng)然,假如用戶的顯示卡只支持標(biāo)準(zhǔn) VGA 模式,則 SVGALib 還是比較好的選擇。
  
  1.3 FrameBuffer
  
  FrameBuffer 是出現(xiàn)在 2.2.xx 內(nèi)核當(dāng)中的一種驅(qū)動程序接口。這種接口將顯示設(shè)備抽象為幀緩沖區(qū)。用戶可以將它看成是顯示內(nèi)存的一個(gè)映像,將其映射到進(jìn)程地址空間之后,就可以直接進(jìn)行讀寫操作,而寫操作可以立即反應(yīng)在屏幕上。該驅(qū)動程序的設(shè)備文件一般是 /dev/fb0、/dev/fb1 等等。比如,假設(shè)現(xiàn)在的顯示模式是 1024x768-8 位色,則可以通過如下的命令清空屏幕:
  
  $ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
  
  在應(yīng)用程序中,一般通過將 FrameBuffer 設(shè)備映射到進(jìn)程地址空間的方式使用,比如下面的程序就打開 /dev/fb0 設(shè)備,并通過 mmap 系統(tǒng)調(diào)用進(jìn)行地址映射,隨后用 memset 將屏幕清空(這里假設(shè)顯示模式是 1024x768-8 位色模式,線性內(nèi)存模式):
  
  int fb;
  unsigned char* fb_mem;
  
  fb = open (“/dev/fb0”, O_RDWR);
  fb_mem = mmap (NULL, 1024*768, PROT_READPROT_WRITE,MAP_SHARED,fb,0);
  
  memset (fb_mem, 0, 1024*768);
  
  FrameBuffer 設(shè)備還提供了若干 ioctl 命令,通過這些命令,可以獲得顯示設(shè)備的一些固定信息(比如顯示內(nèi)存大小)、與顯示模式相關(guān)的可變信息(比如分辨率、象素結(jié)構(gòu)、每掃描線的字節(jié)寬度),以及偽彩色模式下的調(diào)色板信息等等。
  
  通過 FrameBuffer 設(shè)備,還可以獲得當(dāng)前內(nèi)核所支持的加速顯示卡的類型(通過固定信息得到),這種類型通常是和特定顯示芯片相關(guān)的。比如目前最新的內(nèi)核(2.4.9)中,就包含有對 S3、Matrox、nVidia、3Dfx 等等流行顯示芯片的加速支持。在獲得了加速芯片類型之后,應(yīng)用程序就可以將 PCI 設(shè)備的內(nèi)存I/O(memio)映射到進(jìn)程的地址空間。這些 memio 一般是用來控制顯示卡的寄存器,通過對這些寄存器的操作,應(yīng)用程序就可以控制特定顯卡的加速功能。
  
  PCI 設(shè)備可以將自己的控制寄存器映射到物理內(nèi)存空間,而后,對這些控制寄存器的訪問,給變成了對物理內(nèi)存的訪問。因此,這些寄存器又被稱為“memio”。一旦被映射到物理內(nèi)存,Linux 的普通進(jìn)程就可以通過 mmap 將這些內(nèi)存 I/O 映射到進(jìn)程地址空間,這樣就可以直接訪問這些寄存器了。
  
  當(dāng)然,因?yàn)椴煌娘@示芯片具有不同的加速能力,對memio 的使用和定義也各自不同,這時(shí),就需要針對加速芯片的不同類型來編寫實(shí)現(xiàn)不同的加速功能。比如大多數(shù)芯片都提供了對矩形填充的硬件加速支持,但不同的芯片實(shí)現(xiàn)方式不同,這時(shí),就需要針對不同的芯片類型編寫不同的用來完成填充矩形的函數(shù)。
  
  說到這里,讀者可能已經(jīng)意識到 FrameBuffer 只是一個(gè)提供顯示內(nèi)存和顯示芯片寄存器從物理內(nèi)存映射到進(jìn)程地址空間中的設(shè)備。所以,對于應(yīng)用程序而言,假如希望在 FrameBuffer 之上進(jìn)行圖形編程,還需要完成其他許多工作。舉個(gè)例子來講,F(xiàn)rameBuffer 就像一張畫布,使用什么樣子的畫筆,如何畫畫,還需要你自己動手完成。
  
  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)域的高級函數(shù)庫
  
  2.1 Xlib 及其他相關(guān)函數(shù)庫
  
  在 X Window 系統(tǒng)中進(jìn)行圖形編程時(shí),可以選擇直接使用 Xlib。Xlib 實(shí)際是對底層 X 協(xié)議的封裝,可通過該函數(shù)庫進(jìn)行一般的圖形輸出。假如你的 X Server 支持 DGA,則可以通過 DGA 擴(kuò)展直接訪問顯示設(shè)備,從而獲得加速支持。對一般用戶而言,由于 Xlib 的接口太原始而且復(fù)雜,因此一般的圖形程序選擇其他高級一些的圖形庫作為基礎(chǔ)。比如,GTK、QT 等等。這兩個(gè)函數(shù)同時(shí)還是一些高級的圖形用戶界面支持函數(shù)庫。由于種種原因,GTK、QT 等函數(shù)庫存在有龐大、占用系統(tǒng)資源多的問題,不太適合在嵌入式系統(tǒng)中使用。這時(shí),你可以選擇使用 FLTK,這是一個(gè)輕量級的圖形函數(shù)庫,但它的主要功能集中在用戶界面上,提供了較為豐富的控件集。
  
  2.2 SDL
  
  SDL(Simple DirectMedia Layer)是一個(gè)跨平臺的多媒體游戲支持庫。其中包含了對圖形、聲音、游戲桿、線程等等的支持,目前可以運(yùn)行在許多平臺上,其中包括 X Window、X Window with DGA、Linux FrameBuffer 控制臺、Linux SVGALib,以及Windows DirectX、BeOS 等等。
  
  因?yàn)?SDL 專門為游戲和多媒體應(yīng)用而設(shè)計(jì)開發(fā),所以它對圖形的支持非常優(yōu)秀,尤其是高級圖形能力,比如 Alpha 混和、透明處理、YUV 覆蓋、Gamma 校正等等。而且在 SDL 環(huán)境中能夠非常方便地加載支持 OpenGL 的 Mesa 庫,從而提供對二維和三維圖形的支持。
  
  可以說,SDL 是編寫跨平臺游戲和多媒體應(yīng)用的最佳平臺,也的確得到了廣泛應(yīng)用。相關(guān)信息,可參閱 http://www.libsdl.org。
  
  2.3 Allegro
  
  Allegro 是一個(gè)專門為 x86 平臺設(shè)計(jì)的游戲圖形庫。最初的 Allegro 運(yùn)行在 DOS 環(huán)境下,而目前可運(yùn)行在 Linux FrameBuffe 控制臺、Linux SVGALib、X Window 等系統(tǒng)上。Allegro 提供了一些豐富的圖形功能,包括矩形填充和樣條曲線生成等等,而且具有較好的三維圖形顯示能力。
由于 Allegro 的許多要害代碼是采用匯編編寫的,所以該函數(shù)庫具有運(yùn)行速度快、資源占用少的特點(diǎn)。然而,Allegro 也存在如下缺點(diǎn):
  
  1)對線程的支持較差。Allegro 的許多函數(shù)是非線程安全的,不能同時(shí)在兩個(gè)以上的線程中使用。
  2)對硬件加速能力的支持不足,在設(shè)計(jì)上沒有為硬件加速提供接口。
  
  有關(guān) Allegro 的進(jìn)一步信息,可參閱http://www.allegro.cc/。
  
  2.4 Mesa3D

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安仁县| 时尚| 北海市| 郯城县| 华宁县| 龙泉市| 连平县| 桃源县| 河源市| 托克托县| 精河县| 东宁县| 辽中县| 宁武县| 通州区| 治多县| 苍山县| 玉林市| 清原| 崇州市| 赞皇县| 彭阳县| 塔河县| 邵阳县| 舟曲县| 泊头市| 金乡县| 平武县| 同仁县| 双桥区| 衡南县| 郴州市| 杭锦旗| 北宁市| 郁南县| 佛山市| 富川| 通渭县| 富川| 和田市| 宜君县|