1. 课程导入

在嵌入式 Linux 设备上,图形界面往往要在有限的 CPU、内存和 GPU 资源下运行。有人选择 Qt、有人选择 GTK,也有人直接操作 Framebuffer。而 DirectFB(Direct Frame Buffer)正是介于底层显示驱动与上层图形应用之间的一层轻量级图形库,它把 Framebuffer、硬件加速、输入设备、窗口管理等能力整合成一套统一的 API,让开发者不必为每块屏幕、每个 GPU 重写绘图代码。

本课程面向已经具备 C 语言与 Linux 基础的嵌入式开发者,目标是让你从“知道 DirectFB 是什么”走到“能用 DirectFB 完成一个可运行的图形应用”。本章作为导入,先建立整体认知地图:DirectFB 的定义、发展历史、在图形栈中的位置,以及整个课程的学习路径。

一、DirectFB 是什么

DirectFB 是一个运行在 Linux Framebuffer(/dev/fbX)之上的开源图形库,最初由德国 Convergence 公司开发。它的核心思想是“直接访问帧缓冲”,通过 IDirectFB、ISurface、IWindow 等接口,把显示、绘图、窗口、输入统一封装。它并不依赖 X Window,因此非常适合资源受限、无桌面环境的嵌入式设备。

从能力上看,DirectFB 主要提供四类功能:

  • 显示与图层管理:管理 Framebuffer、多图层(Layer)、显示模式与分辨率切换。
  • Surface 绘图:提供像素格式转换、Blit、Fill、StretchBlit 等 2D 加速操作。
  • 窗口系统:内置轻量窗口管理器,支持窗口创建、堆叠、焦点与事件分发。
  • 输入与事件:统一处理键盘、鼠标、触摸屏、遥控器等输入设备。
DirectFB 的定位可以概括为:“嵌入式 Linux 上的轻量图形中间件”。它向上提供统一 API,向下屏蔽 Framebuffer 与硬件加速差异,是连接驱动与应用的桥梁。

二、发展历史与版本脉络

DirectFB 诞生于 2000 年前后,早期版本主要解决“在无 X11 的嵌入式设备上做图形界面”的问题。2001 年发布 0.9.x,2003 年进入 1.0 时代,随后被大量机顶盒、IPTV、车载导航和工业 HMI 采用。2008 年前后,DirectFB 2.0 引入更完善的窗口与合成能力。随着 Wayland、Qt/EGL 的兴起,DirectFB 在新项目中的使用减少,但在大量存量嵌入式设备中仍然活跃。

阶段代表版本关键特征
起步期0.9.x直接操作 Framebuffer,基础 Blit 与输入
成熟期1.0 ~ 1.4窗口管理、图层、硬件加速接口稳定
扩展期1.6 ~ 1.7多应用、合成、更多输入设备支持
维护期2.x窗口系统增强,社区维护为主

三、DirectFB 在嵌入式图形栈中的位置

理解 DirectFB 的关键,是把它放回整条图形栈中。最底层是显示控制器与 GPU 驱动;其上是 Linux Framebuffer 或 DRM/KMS;DirectFB 位于 Framebuffer 之上、应用框架之下。它既可以作为 Qt/GTK 的底层后端,也可以被应用程序直接调用。

嵌入式 Linux 图形栈分层 应用层 Qt / GTK / 自研 UI / 播放器 图形中间件层 DirectFB:Surface / Window / Layer / Input 显示与输入抽象层 Framebuffer (/dev/fbX) · evdev · DRM/KMS 内核驱动层 显示控制器驱动 · GPU 驱动 · 输入驱动 硬件层 SoC · LCD/HDMI 屏 · 触摸屏 · GPU 本课程 核心

从图中可以看到,DirectFB 处在“承上启下”的位置:向上为应用提供统一绘图与窗口接口,向下通过 Framebuffer 与 evdev 访问硬件。它不替代内核驱动,也不替代 Qt 这类完整 UI 框架,而是提供更贴近硬件的图形能力。

四、典型应用场景

DirectFB 最常见的落地场景包括:机顶盒与 IPTV 的 OSD 叠加、车载中控的仪表与视频层合成、工业 HMI 的触摸界面、以及数字标牌的图片与视频播放。这些场景的共同点是:屏幕分辨率固定、硬件资源有限、需要直接控制图层与视频叠加。

# 查看系统是否支持 DirectFB
ls /dev/fb*
cat /proc/fb

# 运行 DirectFB 自带示例
dfbinfo
df_dok

# 典型输出片段
=======================| DirectFB 1.7.7 |=======================
   (c) 2001-2020  DirectFB community
...
Display Information:
   Resolution: 1024 x 600
   Pixelformat: ARGB

五、学习目标与课程框架

本课程共 30 章,整体按“认知 → 环境 → 核心 API → 窗口与输入 → 性能与调试 → 综合实战”推进。学完后,你应当能够独立完成一个基于 DirectFB 的嵌入式图形应用。

  1. 基础认知:DirectFB 定义、历史、图形栈位置、编译与运行环境。
  2. 核心对象:IDirectFB、ISurface、IDirectFBSurface 的创建与生命周期。
  3. 绘图能力:像素格式、Blit、Fill、StretchBlit、颜色键与 Alpha 混合。
  4. 窗口与图层:IWindow、Layer、窗口堆叠与合成。
  5. 输入事件:键盘、鼠标、触摸屏事件循环与分发。
  6. 性能与调试:dfbinfo、日志、双缓冲、硬件加速开关。
  7. 综合实战:从零搭建一个可交互的嵌入式图形界面。
学习建议:每章都动手敲一遍代码,并在真实开发板或 QEMU 上运行。DirectFB 的很多问题(如像素格式不匹配、图层不可用)只有跑起来才会暴露。

六、常见误区与复盘

初学者最容易踩的坑有三个。第一,把 DirectFB 当成“另一个 Qt”,实际上它更底层,窗口管理能力有限,复杂 UI 通常仍需上层框架。第二,忽略 Framebuffer 配置,导致分辨率或像素格式与代码不一致,出现花屏。第三,忘记释放 Surface 与关闭 DirectFB,造成内存泄漏或设备占用。

排障口诀:先看 /dev/fbX,再看 dfbinfo,最后查像素格式与图层权限。 大多数“黑屏、花屏、无法创建 Surface”都能沿这条路径定位。

本章建立了 DirectFB 的整体认知:它是一个轻量、直接、面向嵌入式的图形中间件,位于 Framebuffer 之上、应用框架之下。接下来,我们将从环境搭建开始,真正把 DirectFB 跑起来。