1. 介绍
UI,User Interface,即用户界面,是系统和用户之间进行交互和信息交换的媒介,也即计算机操作用户接口
GUI,Graphical User Interface,即图形用户界面,是指采用图形方式显示的计算机操作用户接口
GUI在不同操作系统上的实现均不同
- Windows: APP -> GDI -> DDI -> Hardware - Linux: APP -> X Windows -> X Server -> 图形驱动 -> Hardware - Mac OS X: APP -> Quartz –> Darwin -> Hardware
2. 图形驱动
这里主要介绍Linux上图形驱动方式/底层支持库
- VGA - Framebuffer - DirectFB - X Window
2.1 VGA
VGA是Video Graphics Array的缩写,是指640×480分辨率的显示标准
它是显卡制造商所共同支持的一个低标准,直接对显卡上的寄存器操作,这种方式的移植性很差,速度也比较慢
SVGALib是VGA驱动函数库,提供了控制台上的图形(Graphic Console)编程接口
2.2 Framebuffer
Framebuffer设备提供了显卡的抽象描述,同时代表了显卡上的显存
用户进程通过对FrameBuffer设备(/dev/fbN)操作来完成直接对屏幕的操作
FrameBuffer默认就编译进了Linux内核,它也提供了控制台上的图形(Graphic Console)编程接口
更多内容可参考:
<Framebuffer HOWTO>
<Linux驱动修炼之道-framebuffer>
<Framebuffer原理、使用、测试系列>
2.3 DirectFB
DirectFB是一个轻量级的提供硬件图形加速,输入设备处理和抽象的图形库,基于Framebuffer运行
DirectFB是为嵌入式系统而设计,它是以最小的资源开销来实现最高的硬件加速性能
2.4 X Window
X Window通过软件工具及架构协议来创建操作系统所用的图形用户界面,包括了工具包及架构规范;目前最流行的则是X.Org所用的协议版本为X11
下图将X Window的整个架构完整地描述了出来
从图中可以看出,X Window是一种客户机/服务器模型,它们之间则通过X Protocol来进行通信
X Server运行在有键盘、显示器、鼠标的计算机上,用来管理显示信息,处理键盘和鼠标输入;而每个应用程序就是一个X Client;Client给Server发送信息,Server则进行处理如绘制图形
X Server: 由XFree86, X.org提供了支持
X Client: 由Xlib提供支持库,再经过封装成GUI Toolkit或者Widget ToolKits(如GTK+,Qt),供上层应用程序使用
值得一说的是,Wayland是一个规定显示服务器与其客户机之间通信方式的协议,用以取代X Window System
参考:
<FreeBSD X Window>
<OpenGroup X Window System>
3. 高级图形库
3.1 Xlib
在X Window中进行图形编程,可以选择使用Xlib;Xlib实际上是对底层X协议的封装,可通过该函数库进行一般的图形输出
但是Xlib的接口太原始而且复杂,因此一般的图形程序选择其他高级一些的图形库作为基础,比如GTK、QT、FLTK等
3.2 SDL
SDL即Simple DirectMedia Layer,是一个跨平台的多媒体游戏支持库,包含了对图形、声音、游戏杆、线程的支持,可以运行在X Window、FrameBuffer、SVGALib,DirectX、BeOS等平台上
SDL是专门为游戏和多媒体应用而设计开发,所以它对图形的支持非常优秀,尤其是高级图形能力
3.3 Mesa3D
Mesa3D是一个兼容OpenGL规范的开放源码函数库,同时也是一个跨平台的函数库,能够运行在X Window、BeOS、SVGALib等平台上
OpenGL定义了跨编程语言、跨平台的API规格,用于生成2D/3D图形
3.4 其他图形库
Cairo: 一个2D图形库
FLTK: 一种使用C++开发的跨平台GUI工具包
NxWidgets: 是NuttX实时嵌入式操作系统的GUI图形用户界面包
参考:
<The Xlib Manual>
<Graphical User Interface Elements>
<基于GTK+和X-window的GUI在嵌入式Linux中的应用>