
应用程序层
- 作用:应用程序是用户直接交互的程序,负责具体的图形内容(如按钮、文字、图像)。
- 工作原理
- 应用程序调用图形库(如Qt、GTK)的API,生成绘制命令。
- 这些命令通过显示服务和驱动,最终渲染到屏幕。
桌面环境/窗口管理器
- 作用:桌面环境(DE)或窗口管理器(WM)管理窗口的外观、行为和用户交互(如拖动、调整大小)。
- 桌面环境(Desktop Enviroment):一组工具集,也即你能看到图形界面;比如图标、菜单栏、壁纸、桌面窗口等。
- KDE Plasma:基于QT开发,使用 KWin,支持 Wayland 和 X11。
- MATE
- GNOME(Ubuntu):基于GTK+(GTK升级版)开发,使用 Mutter 作为 Wayland 合成器,支持 X11。
- Cinnamon
- Budgie
- LXQt:轻量级桌面环境,通常基于 X11。
- Xfce:轻量级桌面环境,通常基于 X11。
- Deepin
- 窗口管理器
- 独立 WM(如 i3、Openbox)更轻量,适合自定义。
- 负责窗口的边框、标题栏、层叠顺序等。
- 工作原理
- 桌面环境通过显示服务器管理窗口的绘制和输入事件。
- 在 Wayland 中,桌面环境的合成器直接处理窗口渲染;在 X11 中,窗口管理器与 X 服务器协作。
图形库层(Qt、GTK、OpenGL 等)
- 作用:图形库为应用程序提供高级 API,简化绘制任务(如窗口、按钮、文字)。
- 常见图形库
- Qt:跨平台框架,用于绘制 GUI(如 KDE 桌面、ComfyUI)。
- GTK:用于 GNOME 环境的 GUI 框架。
- OpenGL/Vulkan:用于 3D 渲染、游戏或高性能图形。
- Cairo:2D 矢量图形库,适合绘制简单的图形和文字。
- Mesa:开源实现 OpenGL,支持硬件加速。
- 工作原理:
- 图形库将高级绘制命令(如“画一个按钮”)转换为低级指令,发送给显示服务器或直接与 GPU 交互(通过 DRM)。
- 例如,Qt 提供 QPainter 类,开发者调用 drawText 方法绘制文字,底层会调用 OpenGL 或 X11/Wayland API。
显示服务器层(X11 或 Wayland)
- 作用:显示服务器是用户空间的核心组件,负责协调应用程序的图形绘制、窗口管理和输入事件(键盘、鼠标)。
- 主要实现:
- X11(X Window System):
- 传统显示服务器,广泛使用(如 Xorg)。
- 客户端-服务器架构:应用程序(客户端)通过 X 协议与 X 服务器通信。
- X 服务器管理窗口位置、绘制请求,并将结果发送到帧缓冲区。
- Wayland:
- 现代显示服务器,替代 X11,设计更简单高效。
- 使用合成器(Compositor)直接管理渲染,减少中间层。
- 常见实现:Weston、GNOME 的 Mutter、KDE 的 KWin。
- 工作原理:
- X11:应用程序发送绘制命令(如“画一个矩形”)给 X 服务器,X 服务器通过驱动与 GPU 通信。
- Wayland:应用程序直接渲染到缓冲区,合成器将缓冲区内容组合并显示。
内核层(Linux Kernel 和驱动)
- 作用:内核层提供硬件抽象,管理 GPU 和显示设备,并为上层提供接口。
- 组件:
- DRM(Direct Rendering Manager):Linux 内核的子系统,管理 GPU 硬件,处理渲染、缓冲区管理和显示输出。
- KMS(Kernel Mode Setting):DRM 的子模块,负责设置显示模式(如分辨率、刷新率)。
- GPU 驱动:
- 开源驱动(如 Mesa 的 nouveau、amdgpu、intel)。
- 闭源驱动(如 NVIDIA 官方驱动)。
- 提供对 GPU 的直接访问,支持 2D/3D 渲染。
- 帧缓冲设备(fbdev):较老的接口,提供基本的帧缓冲区访问(现多被 DRM/KMS 取代)。
- 工作原理:
- 内核通过 DRM/KMS 与 GPU 通信,管理帧缓冲区(显存中的一块区域,存储待显示的像素)。
- 用户空间程序通过驱动接口(如 /dev/dri/card0)发送绘制指令。
硬件层(GPU 和显示设备)
- 作用:硬件层是图形绘制的物理基础,负责实际的像素渲染和显示。
- 组件:
- GPU(图形处理器):执行图像计算,如绘制像素、纹理映射、3D 渲染等。常见 GPU 包括 NVIDIA、AMD、Intel 集成显卡。
- 显示设备:显示器或屏幕,接收 GPU 的输出信号,显示图像。
- 工作原理:
- GPU 接收绘制指令,处理像素数据,存储在帧缓冲区(Frame Buffer)。
- 帧缓冲区的内容通过显示接口(如 HDMI、DisplayPort)发送到屏幕。