1. Vblank 中断基础概念
1.1 什么是 Vblank(垂直消隐期)
Vblank(Vertical Blanking Interval,垂直消隐期)是显示设备在完成一帧画面扫描后,电子枪(或扫描线)从屏幕右下角返回左上角准备开始下一帧所花费的短暂时间间隔。在这段时间内,没有像素数据被实际传输到显示面板,因此对用户不可见。
关键理解: Vblank 是显示系统提供的“安全窗口”——在此期间更新帧缓冲区不会产生撕裂(tearing)或部分更新等视觉伪影。
在 CRT 时代,Vblank 是电子束回扫的物理需要;在 LCD/OLED 时代,它仍然是显示接口(如 HDMI、DisplayPort、MIPI DSI)协议中强制保留的时序间隙,用于同步源端与显示端的时钟与数据流。
1.2 Vblank 在显示驱动中的作用
在显示驱动软件栈中,Vblank 中断是连接硬件刷新周期与软件渲染/合成管线的关键同步信号。其核心作用包括:
| 作用领域 | 具体功能 | 重要性 |
|---|---|---|
| 帧同步 | 通知驱动/应用层:上一帧已完整扫描完毕,可以安全更新帧缓冲区 | 防止撕裂 |
| 时序基准 | 提供精确的垂直同步(VSync)时间戳,用于帧率控制和动画平滑 | 保证流畅度 |
| 低功耗触发 | 在 Vblank 期间可关闭部分显示管线或降低时钟频率以节省功耗 | 能效优化 |
| 多缓冲交换 | 触发双缓冲/三缓冲的 front buffer 与 back buffer 交换操作 | 降低延迟 |
| 外设同步 | 与 GPU、显示控制器、DMA 引擎协同,协调数据搬运时机 | 系统一致性 |
实践要点: 驱动中 Vblank 中断服务程序(ISR)应尽可能短——只做标记和唤醒,不做帧缓冲区拷贝或复杂计算,以避免阻塞后续中断。
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 信号,驱动渲染管线提前完成帧提交
1.4 Vblank 中断的硬件触发机制
从硬件角度看,Vblank 中断的触发流程如下:
- 显示控制器(如 Intel i915、ARM Komeda、NVIDIA Tegra DC)内部维护一个行计数器(line counter),逐行扫描。
- 当行计数器达到垂直后肩(vertical back porch)起始位置时,硬件判定进入 Vblank 区域。
- 显示控制器向 CPU 的 中断控制器(如 GIC、APIC)发送一个电平或边沿触发的中断信号。
- CPU 响应中断,执行注册在显示驱动中的 Vblank ISR。
- ISR 中通常执行:清除中断标志 → 更新 vblank 时间戳 → 唤醒等待 vblank 的进程 → 触发帧完成回调。
优化切入点: 步骤 3→4 的中断延迟(interrupt latency)受 CPU 电源管理、中断优先级、其他中断抢占等因素影响,是驱动延迟优化的首要目标之一。
1.5 常见误解与澄清
| 误解 | 事实 |
|---|---|
| Vblank 只存在于 CRT 显示器 | 所有数字显示接口(HDMI、DP、MIPI DSI、eDP)都保留 Vblank 时序,是协议规范的一部分 |
| Vblank 中断频率等于帧率 | 严格正确。每帧触发一次 Vblank 中断,但部分硬件支持 Vblank 计数器的子帧精度 |
| Vblank 期间可以任意操作显示硬件 | 部分寄存器只能在 Vblank 期间写入(如帧缓冲地址),但并非所有寄存器都受此限制 |
| Vblank 中断优先级越高越好 | 过高优先级可能抢占关键实时任务;需根据系统负载平衡设置 |
学习建议: 在阅读具体驱动代码(如 Linux DRM 的
drm_vblank.c)之前,先通过本节的硬件时序图建立 Vblank 中断的物理直觉——这将帮助你理解后续所有优化策略的出发点。