1. Vblank 中断基础概念

1.1 什么是 Vblank(垂直消隐期)

Vblank(Vertical Blanking Interval,垂直消隐期)是显示设备在完成一帧画面扫描后,电子枪(或扫描线)从屏幕右下角返回左上角准备开始下一帧所花费的短暂时间间隔。在这段时间内,没有像素数据被实际传输到显示面板,因此对用户不可见。

关键理解: Vblank 是显示系统提供的“安全窗口”——在此期间更新帧缓冲区不会产生撕裂(tearing)或部分更新等视觉伪影。

在 CRT 时代,Vblank 是电子束回扫的物理需要;在 LCD/OLED 时代,它仍然是显示接口(如 HDMI、DisplayPort、MIPI DSI)协议中强制保留的时序间隙,用于同步源端与显示端的时钟与数据流。

Vblank 在帧扫描时序中的位置 帧 N 可见区 Vblank (垂直消隐) 帧 N+1 可见区 ~16.67ms (60Hz) ~1.5ms ~16.67ms (60Hz) Vblank 期间不传输像素数据,是更新帧缓冲区的理想时机。 在此窗口内完成交换可避免画面撕裂(tearing)。

1.2 Vblank 在显示驱动中的作用

在显示驱动软件栈中,Vblank 中断是连接硬件刷新周期与软件渲染/合成管线的关键同步信号。其核心作用包括:

作用领域 具体功能 重要性
帧同步 通知驱动/应用层:上一帧已完整扫描完毕,可以安全更新帧缓冲区 防止撕裂
时序基准 提供精确的垂直同步(VSync)时间戳,用于帧率控制和动画平滑 保证流畅度
低功耗触发 在 Vblank 期间可关闭部分显示管线或降低时钟频率以节省功耗 能效优化
多缓冲交换 触发双缓冲/三缓冲的 front buffer 与 back buffer 交换操作 降低延迟
外设同步 与 GPU、显示控制器、DMA 引擎协同,协调数据搬运时机 系统一致性
实践要点: 驱动中 Vblank 中断服务程序(ISR)应尽可能短——只做标记和唤醒,不做帧缓冲区拷贝或复杂计算,以避免阻塞后续中断。
Vblank 中断在显示驱动软件栈中的位置 应用 / 游戏引擎 图形库 (OpenGL/Vulkan) 显示驱动 (DRM/KMS) Vblank 中断处理 | 帧缓冲管理 | 模式设置 显示控制器 / GPU VSync 信号 → Vblank 中断 Vblank 中断流程 1. 硬件检测到 Vblank 2. 触发中断到 CPU 3. 驱动 ISR 处理 4. 唤醒等待队列 5. 应用更新帧缓冲

1.3 Vblank 中断与屏幕刷新率的关系

屏幕刷新率(Refresh Rate)决定了 Vblank 中断的触发频率。两者之间存在严格的数学对应关系:

刷新率 (Hz) 帧周期 (ms) 典型 Vblank 时长 (ms) Vblank 中断频率 (次/秒)
60 16.67 ~1.5 60
90 11.11 ~1.0 90
120 8.33 ~0.8 120
144 6.94 ~0.7 144
240 4.17 ~0.4 240
注意: 高刷新率下 Vblank 窗口变窄,中断处理时间预算被压缩。如果 ISR 执行时间超过 Vblank 时长,将导致中断丢失(missed vblank),进而引发帧率抖动或画面卡顿。

Vblank 中断与刷新率的联动关系决定了显示驱动延迟优化的两个核心方向:

  • 缩短 ISR 执行时间 —— 确保在高刷新率下仍能在 Vblank 窗口内完成处理
  • 提前准备帧数据 —— 利用 Vblank 中断作为 deadline 信号,驱动渲染管线提前完成帧提交
不同刷新率下 Vblank 窗口对比 60Hz Vblank 帧 N 可见区 (15.17ms) 120Hz Vblank 帧 N 可见区 (7.53ms) 240Hz Vblank 帧 N 可见区 (3.77ms) 关键观察: 刷新率越高,Vblank 窗口越窄。240Hz 下 Vblank 仅约 0.4ms, 中断处理必须在 400μs 内完成,否则将错过下一个 Vblank 信号。

1.4 Vblank 中断的硬件触发机制

从硬件角度看,Vblank 中断的触发流程如下:

  1. 显示控制器(如 Intel i915、ARM Komeda、NVIDIA Tegra DC)内部维护一个行计数器(line counter),逐行扫描。
  2. 当行计数器达到垂直后肩(vertical back porch)起始位置时,硬件判定进入 Vblank 区域。
  3. 显示控制器向 CPU 的 中断控制器(如 GIC、APIC)发送一个电平或边沿触发的中断信号。
  4. CPU 响应中断,执行注册在显示驱动中的 Vblank ISR。
  5. ISR 中通常执行:清除中断标志 → 更新 vblank 时间戳 → 唤醒等待 vblank 的进程 → 触发帧完成回调。
优化切入点: 步骤 3→4 的中断延迟(interrupt latency)受 CPU 电源管理、中断优先级、其他中断抢占等因素影响,是驱动延迟优化的首要目标之一。
Vblank 中断硬件触发流程 显示控制器 行计数器达到 Vblank 中断信号 中断控制器 GIC / APIC IRQ CPU 执行 Vblank ISR 显示驱动 ISR 清除标志 → 更新时间戳 → 唤醒 延迟组成: 中断延迟 = 显示控制器检测延迟 + 中断控制器路由延迟 + CPU 响应延迟 + ISR 执行延迟 其中 CPU 响应延迟受中断屏蔽、电源状态(WFI/PC状态)影响最大。

1.5 常见误解与澄清

误解 事实
Vblank 只存在于 CRT 显示器 所有数字显示接口(HDMI、DP、MIPI DSI、eDP)都保留 Vblank 时序,是协议规范的一部分
Vblank 中断频率等于帧率 严格正确。每帧触发一次 Vblank 中断,但部分硬件支持 Vblank 计数器的子帧精度
Vblank 期间可以任意操作显示硬件 部分寄存器只能在 Vblank 期间写入(如帧缓冲地址),但并非所有寄存器都受此限制
Vblank 中断优先级越高越好 过高优先级可能抢占关键实时任务;需根据系统负载平衡设置
学习建议: 在阅读具体驱动代码(如 Linux DRM 的 drm_vblank.c)之前,先通过本节的硬件时序图建立 Vblank 中断的物理直觉——这将帮助你理解后续所有优化策略的出发点。