我觉得 Paul 的回答可能有点专业术语,所以这是我的尝试。
有负载显示设备(VGA 显示器、复合视频、HDMI 等),这些往往直接在硬件中处理,例如。在专用图形处理器 (GPU) 中。
我们使用驱动程序(位于我们的操作系统内核中),而不是让我们的应用程序直接与该硬件通信。不同的硬件需要不同的驱动程序,但是所有的驱动程序都可以使用相同的接口给出指令,例如OpenGL:
App --OpenGL--> Driver --> Hardware --VGA--> Screen
当然,像大多数标准一样,实际上有一大堆不同的标准!大多数操作系统上的大多数驱动程序都支持 OpenGL;它的“OpenGL ES”子集在手机上运行良好,并且有“软件驱动程序”可以根据 OpenGL 指令创建图像(所有驱动程序都可以绘制图像,尽管这比拥有真正的 OpenGL 支持)。 OpenGL 的一大竞争对手是 DirectX,但它只适用于 Windows 和 XBox。
渲染到 OpenGL 适合全屏 3D 游戏,但 *NIX 图形系统(称为“X”)在此基础上提供了两个主要功能:绘制多个应用程序在同一屏幕上并通过网络进行绘图。为此,服务器进程绘制到屏幕上,应用程序(“客户端”)使用“X11 协议”(“11”只是版本号)与该服务器通信:
App A ----------OpenGL-------+
|
App B --+ |
| |
+--X11--> X server --+----> Driver --> Hardware --> Screen
|
App C --+
|
...network ...
|
App D --+
X 倾向于直接访问驱动程序,因为它比 OpenGL 存在的时间更长,但这并不是太重要。
X11 协议的工作原理是让应用程序创建允许它们绘制的窗口。X 可以在屏幕上排列这些窗口,包括重叠它们。使用 OpenGL 的应用程序可以让它们的命令直接“通过”X 到驱动程序,并且 X 仍然会像其他任何窗口一样排列窗口(这将不在网络上工作,因为它绕过了网络功能X11)。
我们通常有一个专门为我们安排、隐藏/显示和关闭窗口的应用程序,称为 窗口管理器。或者,窗口管理器可能会在其他窗口的边缘创建一些薄窗口,以便它可以绘制标题栏、调整手柄大小等。
X11 协议包括用于绘制形状、渲染字体等的命令,并且有一些应用程序直接使用这些命令,例如xterm 程序和twm 窗口管理器:
xterm --+
|
+--X11--> X --> Driver --> ...
|
twm --+
但是,大多数现代应用程序发现原始 X11 太乏味了;我们宁愿绘制整个小部件(按钮、菜单、图标等),而不是绘制线条和形状。为此,已创建工具包。最著名的两个称为 Qt 和 GTK+(GIMP 工具包,因为它最初是为 GIMP 创建的);其他包括 Motif、Lesstif、ETK、Tk 和 FLTK。我们可以要求工具包绘制一个按钮,它会发送所有必要的 X11 命令来绘制一个按钮,另外它会处理大小和位置,刷新如果有东西覆盖它然后绘制移开,在单击按钮时告诉我们的代码,并且一些工具包甚至允许使用 themes 更改小部件的外观。有些工具包也是跨平台的,所以它们会在 Linux 上发送 X11 命令,在 Windows、OSX 等上发送不同的命令。
Rhythmbox --> GTK+ --+
|
GIMP --> GTK+ --+
|
Amarok --> Qt --+--X11--> X --> Driver --> ...
|
Skype --> Qt --+
|
aMSN --> Tk --+
一些工具包提供了优于其他工具包的功能;例如wxWidgets 让 Qt 进行绘图(在 Linux 上;Windows 和 OSX 是“本地的”),XUL 被 Firefox 使用并使用 GTK+ 进行绘图:
Audacity --> wxWidgets --> Qt --+
|
Firefox --> XUL --> GTK+ --+--X11--> X --> Driver --> ...
|
GIMP ----------------> GTK+ --+
需要提到的重要一点是,X11 的形状和文本绘制命令实际上并没有太多使用,因为它们非常原始。许多工具包实际上将它们的小部件渲染为图像,然后让 X 绘制这些图像。新的 Wayland 系统试图通过放弃绘图命令并让应用程序和工具包直接使用 OpenGL 来取代 X,这应该会使事情变得更快。
您提到了不同的桌面环境,例如 GNOME 和 KDE,以及它们是否可以协同工作。这些基本上是大量编写的应用程序,可以很好地协同工作。碰巧的是,GNOME 应用程序都是用 GTK+ 编写的,而 KDE 应用程序都是用 Qt 编写的。
如果您查看我上面图表中的箭头,您会注意到每个 Qt 应用程序单独与 X 通信,每个 GTK+ 应用程序单独与 X 通信,等等;不仅 Qt 和 GTK+ 应用程序可以并行工作,就 X 而言,这与两个 Qt 应用程序或两个 GTK+ 应用程序相同!
混合桌面时唯一需要担心的是两个应用程序是否在竞争执行相同的工作,例如,如果您尝试运行两个窗口管理器或两个桌面面板。请注意,这不是图形、工具包等问题,因为如果我使用两个基于相同工具包构建的桌面(例如 lxpanel 和gnome-panel 都是用 GTK+ 编写的,但它们仍然会互相妨碍!)