2. 显示子系统基础
在讨论 Vblank 中断与 DMA-BUF 联合调优之前,必须先建立对显示子系统“时间轴”的准确认知。显示控制器并不是一次性把一整帧图像推给屏幕,而是按照严格的扫描时序,逐行、逐像素地输出。屏幕上的每一帧,实际上由若干段“可见区”和“消隐区”拼接而成。理解这些区段的定义、顺序与作用,是后续分析撕裂、卡顿、功耗和带宽问题的前提。
一、LCD 与 OLED 的显示原理差异
LCD(液晶显示)本身不发光,它通过背光层提供光源,再由液晶分子偏转控制每个像素的透光率。液晶分子的偏转需要一定响应时间,因此 LCD 在快速切换画面时容易出现拖影。LCD 的刷新依赖持续扫描,即使画面静止,显示控制器也必须不断刷新,否则液晶电容会漏电导致画面变淡。
OLED(有机发光二极管)则是自发光器件,每个像素独立发光,不需要背光。OLED 的响应速度远快于 LCD,黑色像素可以直接关闭,因此对比度更高、更省电。但 OLED 也存在像素老化不一致导致的烧屏问题,且低亮度下可能采用 PWM 调光,带来频闪。两者虽然物理机制不同,但对显示控制器而言,它们都遵循同一套扫描时序框架:一行一行地传输像素数据,并在帧与帧之间留出消隐时间。
二、扫描时序的完整结构
一帧图像的扫描时序可以拆解为四个核心参数:Vactive、Vfront、Vback 和 Vblank。它们共同决定了一帧的总行数和刷新节奏。
- Vactive(垂直有效区):真正显示图像内容的行数,例如 1920×1080 中的 1080 行。只有在这段区域内,像素数据才会被写入屏幕。
- Vfront(前肩):Vactive 结束后到同步信号到来之前的空行数,用于给显示面板留出缓冲时间。
- Vback(后肩):同步信号结束后到下一帧 Vactive 开始之前的空行数,用于让面板完成电平恢复和准备。
- Vblank(垂直消隐区):Vfront 与 Vback 的统称,加上同步脉冲本身所占的行数,构成一整段不传输可见像素的时间窗口。
类似地,水平方向也有 Hactive、Hfront、Hback 和 Hblank,它们控制每一行内部的像素节奏。垂直时序决定“帧”的边界,水平时序决定“行”的边界,两者共同构成完整的扫描时序。
三、Vblank 的作用与调优意义
Vblank 并不是“浪费的时间”,而是显示子系统留给软件的关键窗口。它的作用主要体现在三个方面:
- 帧同步与防撕裂:显示控制器在 Vblank 期间发出垂直同步信号,图形系统据此判断何时可以安全地切换帧缓冲。如果在 Vactive 期间切换,就会出现上半屏旧帧、下半屏新帧的撕裂现象。
- DMA 换帧与带宽调度:DMA-BUF 的缓冲区切换通常安排在 Vblank 中断中完成,避免与正在进行的像素读取争抢内存带宽。
- 省电与动态刷新:在 Vblank 期间,显示控制器和部分面板电路可以进入低功耗状态。对于支持可变刷新率(VRR)的面板,延长 Vblank 还能降低刷新率,从而节省功耗。
因此,Vblank 的长度和中断处理效率,直接决定了帧切换是否及时、画面是否流畅、系统功耗是否可控。后续章节中关于 Vblank 中断延迟、DMA-BUF 同步和带宽争抢的调优,都是围绕这段窗口展开的。
四、典型参数与场景对照
不同分辨率和刷新率下,扫描时序参数差异很大。下表列出几种常见模式的典型值,帮助建立数量级直觉。
| 显示模式 | Vactive | Vfront | Vback | Vblank 合计 | 帧总行数 | 刷新率 |
|---|---|---|---|---|---|---|
| 1080p @ 60Hz | 1080 | 4 | 36 | 45 | 1125 | 60Hz |
| 1080p @ 120Hz | 1080 | 4 | 36 | 45 | 1125 | 120Hz |
| 1440p @ 60Hz | 1440 | 8 | 48 | 61 | 1501 | 60Hz |
| 4K @ 60Hz | 2160 | 8 | 54 | 67 | 2227 | 60Hz |
可以看到,Vblank 行数通常只占帧总行数的 3%~5%,但它对应的时间窗口在 60Hz 下约为 0.5~0.7ms,在 120Hz 下进一步压缩到 0.25~0.35ms。这个窗口非常短,任何中断延迟或 DMA 调度抖动都可能错过它,导致掉帧或撕裂。
五、常见误区与复盘要点
误区一:把 Vblank 当成“空闲时间”随意占用。 Vblank 窗口极短,若在其中执行耗时较长的内存拷贝或复杂计算,会直接推迟换帧,造成卡顿。
误区二:忽略 Vfront 与 Vback 的区别。 两者虽然都属于 Vblank,但在面板时序中位置不同。某些面板对 Vback 的最小值有硬性要求,配置过小会导致同步失败或花屏。
误区三:认为提高刷新率只是改一个时钟。 刷新率提高后,Vblank 时间同比缩短,对中断响应和 DMA 带宽的要求更苛刻,必须同步调整调优策略。
复盘时建议按以下清单逐项核对:
- 确认当前模式的 Vactive、Vfront、Vback 实际配置值,并与面板手册对照。
- 计算 Vblank 的绝对时间窗口,评估中断处理函数是否能在窗口内完成。
- 检查 DMA-BUF 换帧是否绑定在 Vblank 中断上,是否存在延迟提交。
- 观察是否存在 Vblank 期间带宽争抢,例如 GPU 渲染与显示读取同时访问内存。
- 在可变刷新率场景下,确认 Vblank 延长策略是否与面板支持能力匹配。