2. 帧缓冲核心概念:显存映射、像素格式、颜色深度、屏幕分辨率、刷新率
帧缓冲(Framebuffer)是 Linux 图形子系统的核心抽象层,它将显示设备的内存区域抽象为一个连续的内存块,用户空间程序可以直接通过 mmap 系统调用操作该内存块,从而控制屏幕上的每一个像素。理解帧缓冲的核心概念是掌握整个图形子系统的基础。
2.1 显存映射(Memory Mapping)
显存映射是帧缓冲机制的核心操作。在 fbdev 框架中,显存(Video Memory)被映射到系统内存空间,使得 CPU 可以直接读写显示缓冲区。这个过程通过 mmap 系统调用完成,用户空间程序获得一个指向帧缓冲内存的指针,后续的像素操作直接作用于该内存区域。
fix.smem_start 和 fix.smem_len 描述显存的物理地址和长度。
2.2 像素格式(Pixel Format)
像素格式定义了每个像素在内存中的二进制表示方式。fbdev 使用 struct fb_bitfield 结构体描述每个颜色通道(R/G/B/A)在像素数据中的偏移量和位宽。常见的像素格式包括 RGB565、RGB888、ARGB8888 等。
| 像素格式 | 总位数 | R 通道 | G 通道 | B 通道 | A 通道 | 典型应用 |
|---|---|---|---|---|---|---|
| RGB332 | 8 | 3 位 | 3 位 | 2 位 | 无 | 低端嵌入式 LCD |
| RGB565 | 16 | 5 位 | 6 位 | 5 位 | 无 | 嵌入式设备、低成本屏 |
| RGB888 | 24 | 8 位 | 8 位 | 8 位 | 无 | 桌面显示器、高清屏 |
| ARGB8888 | 32 | 8 位 | 8 位 | 8 位 | 8 位 | 桌面系统、GPU 加速 |
| RGBA8888 | 32 | 8 位 | 8 位 | 8 位 | 8 位 | 现代图形栈(DRM) |
var.nonstd 字段支持非标准像素格式。
2.3 颜色深度(Color Depth)
颜色深度(Color Depth)表示每个像素用于表示颜色的位数,通常以 bits_per_pixel(bpp)表示。颜色深度直接影响显存占用和色彩表现能力。
- 1 bpp: 黑白显示,每个像素仅 1 位(0 或 1),用于单色 LCD 或电子墨水屏。
- 8 bpp: 256 色,通常配合调色板(Palette)使用,用于早期 VGA 或低端嵌入式屏。
- 16 bpp: 65536 色,RGB565 格式,嵌入式设备的主流选择。
- 24 bpp: 1670 万色,RGB888 格式,桌面显示器标准。
- 32 bpp: 1670 万色 + 8 位 Alpha 通道,支持透明混合,现代图形栈标配。
例如:1920 × 1080 @ 32bpp = 1920 × 1080 × 4 = 8,294,400 字节 ≈ 7.9 MB。
2.4 屏幕分辨率(Screen Resolution)
屏幕分辨率由 xres(水平像素数)和 yres(垂直像素数)定义。fbdev 通过 struct fb_var_screeninfo 中的 xres、yres、xres_virtual、yres_virtual 字段支持虚拟分辨率,实现双缓冲或多缓冲机制。
| 分辨率名称 | 水平像素 (xres) | 垂直像素 (yres) | 宽高比 | 典型应用 |
|---|---|---|---|---|
| QVGA | 320 | 240 | 4:3 | 低端嵌入式、工控屏 |
| VGA | 640 | 480 | 4:3 | 经典显示器、老式设备 |
| WVGA | 800 | 480 | 5:3 | 车载娱乐系统 |
| HD | 1280 | 720 | 16:9 | 高清显示器、平板 |
| Full HD | 1920 | 1080 | 16:9 | 桌面显示器、电视 |
| 4K UHD | 3840 | 2160 | 16:9 | 高端显示器、视频墙 |
yres_virtual = 2 * yres 可以实现双缓冲:应用程序在后缓冲区绘制,通过 FBIOPAN_DISPLAY ioctl 切换显示起始地址,避免撕裂。
2.5 刷新率(Refresh Rate)
刷新率(Refresh Rate)表示显示器每秒更新画面的次数,单位为赫兹(Hz)。fbdev 通过 struct fb_var_screeninfo 中的时序参数(pixclock、left_margin、right_margin、upper_margin、lower_margin、hsync_len、vsync_len)精确控制刷新率。
像素时钟频率 = pixclock 的倒数(单位:Hz)
行频 = 像素时钟频率 / (xres + left_margin + right_margin + hsync_len)
刷新率 = 行频 / (yres + upper_margin + lower_margin + vsync_len)
| 刷新率 | 典型应用 | 人眼感知 | 对显存带宽要求 |
|---|---|---|---|
| 60 Hz | 标准桌面、嵌入式 LCD | 基本流畅 | 低 |
| 75 Hz | CRT 显示器、工控屏 | 较流畅 | 中 |
| 120 Hz | 游戏显示器、VR 头显 | 非常流畅 | 高 |
| 144 Hz | 电竞显示器 | 极致流畅 | 很高 |
2.6 核心概念总结
帧缓冲的五个核心概念相互关联,共同决定了显示系统的性能和能力。显存映射提供了访问显示内存的路径;像素格式和颜色深度决定了每个像素的表示方式和色彩质量;屏幕分辨率定义了显示内容的精细程度;刷新率则影响视觉流畅度和系统功耗。
| 概念 | 关键结构体/字段 | 影响维度 | 典型值 |
|---|---|---|---|
| 显存映射 | fix.smem_start, fix.smem_len |
访问性能、内存占用 | 4 MB ~ 16 MB |
| 像素格式 | var.red, var.green, var.blue |
色彩精度、兼容性 | RGB565, RGB888 |
| 颜色深度 | var.bits_per_pixel |
色彩数量、显存占用 | 16, 24, 32 bpp |
| 屏幕分辨率 | var.xres, var.yres |
显示清晰度、显存需求 | 800×480, 1920×1080 |
| 刷新率 | var.pixclock, 时序参数 |
视觉流畅度、功耗 | 60 Hz, 120 Hz |
fb_set_var() 和 fb_set_par() 函数,它们负责验证和应用这些核心参数。理解这些参数的校验逻辑是掌握帧缓冲驱动的关键。