2. 显示子系统基础

在讨论 Vblank 中断与 DMA-BUF 联合调优之前,必须先建立对显示子系统“时间轴”的准确认知。显示控制器并不是一次性把一整帧图像推给屏幕,而是按照严格的扫描时序,逐行、逐像素地输出。屏幕上的每一帧,实际上由若干段“可见区”和“消隐区”拼接而成。理解这些区段的定义、顺序与作用,是后续分析撕裂、卡顿、功耗和带宽问题的前提。

一、LCD 与 OLED 的显示原理差异

LCD(液晶显示)本身不发光,它通过背光层提供光源,再由液晶分子偏转控制每个像素的透光率。液晶分子的偏转需要一定响应时间,因此 LCD 在快速切换画面时容易出现拖影。LCD 的刷新依赖持续扫描,即使画面静止,显示控制器也必须不断刷新,否则液晶电容会漏电导致画面变淡。

OLED(有机发光二极管)则是自发光器件,每个像素独立发光,不需要背光。OLED 的响应速度远快于 LCD,黑色像素可以直接关闭,因此对比度更高、更省电。但 OLED 也存在像素老化不一致导致的烧屏问题,且低亮度下可能采用 PWM 调光,带来频闪。两者虽然物理机制不同,但对显示控制器而言,它们都遵循同一套扫描时序框架:一行一行地传输像素数据,并在帧与帧之间留出消隐时间。

关键认知:无论 LCD 还是 OLED,显示控制器输出的都是“带消隐区的扫描时序”,而不是连续的像素流。Vblank 正是消隐区中最重要的一段。

二、扫描时序的完整结构

一帧图像的扫描时序可以拆解为四个核心参数:Vactive、Vfront、Vback 和 Vblank。它们共同决定了一帧的总行数和刷新节奏。

  • Vactive(垂直有效区):真正显示图像内容的行数,例如 1920×1080 中的 1080 行。只有在这段区域内,像素数据才会被写入屏幕。
  • Vfront(前肩):Vactive 结束后到同步信号到来之前的空行数,用于给显示面板留出缓冲时间。
  • Vback(后肩):同步信号结束后到下一帧 Vactive 开始之前的空行数,用于让面板完成电平恢复和准备。
  • Vblank(垂直消隐区):Vfront 与 Vback 的统称,加上同步脉冲本身所占的行数,构成一整段不传输可见像素的时间窗口。

类似地,水平方向也有 Hactive、Hfront、Hback 和 Hblank,它们控制每一行内部的像素节奏。垂直时序决定“帧”的边界,水平时序决定“行”的边界,两者共同构成完整的扫描时序。

一帧扫描时序:Vactive 与 Vblank 的组成 行号 Vactive 可见像素行,例如 1080 行 Vfront 前肩 Sync 同步 Vback 后肩 Vblank = Vfront + Sync + Vback 时间 像素传输窗口 Vblank 窗口:可处理中断、DMA 换帧、省电 Vactive 决定分辨率高度,Vblank 决定帧间空档与调优空间

三、Vblank 的作用与调优意义

Vblank 并不是“浪费的时间”,而是显示子系统留给软件的关键窗口。它的作用主要体现在三个方面:

  1. 帧同步与防撕裂:显示控制器在 Vblank 期间发出垂直同步信号,图形系统据此判断何时可以安全地切换帧缓冲。如果在 Vactive 期间切换,就会出现上半屏旧帧、下半屏新帧的撕裂现象。
  2. DMA 换帧与带宽调度:DMA-BUF 的缓冲区切换通常安排在 Vblank 中断中完成,避免与正在进行的像素读取争抢内存带宽。
  3. 省电与动态刷新:在 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 延长策略是否与面板支持能力匹配。
掌握扫描时序的四个核心参数,就掌握了显示子系统的时间坐标系。后续所有关于 Vblank 中断和 DMA-BUF 的调优,都是在这个坐标系中寻找“在正确的时间做正确的事”。