2、显示同步基础概念:帧率、刷新率、垂直同步(V-Sync)、画面撕裂(Tearing)、卡顿(Jank)的定义与关系
好,咱们正式开始聊显示同步。说实话,很多做车载的同学,一开始都会把「帧率」和「刷新率」搞混。我当年刚入行时也踩过这个坑。记得有一次在台架上调试一个双屏方案,明明GPU已经跑到60帧了,但副屏就是感觉卡卡的。后来才发现,我根本没搞清楚这两个概念的区别。
这一节,咱们就把这些基础概念掰开揉碎。你理解透了,后面讲帧同步策略时才能跟上节奏。
2.1 帧率(FPS)—— 内容生产的速度
帧率,全称是Frames Per Second,缩写FPS。说白了,就是你的GPU或CPU每秒能生成多少张画面。
- 定义:单位时间内渲染完成的帧数。
- 单位:fps(帧/秒)。
- 典型值:车载场景下,仪表盘通常30fps就够了,中控娱乐屏追求60fps,而AR-HUD可能需要90fps甚至更高。
我个人习惯把帧率理解为「厨房里做菜的速度」。你做得快,客人就能吃上热乎的;做得慢,就得等着。
关键点:帧率是动态变化的。它取决于场景复杂度、GPU负载、内存带宽等因素。你在高速上导航时帧率可能很稳,但一旦切换到3D地图旋转,帧率可能直接掉一半。
2.2 刷新率(Hz)—— 内容消费的速度
刷新率,单位是Hz,指的是显示面板每秒刷新画面的次数。
- 定义:显示器从顶部到底部完整扫描一次的时间倒数。
- 单位:Hz(赫兹)。
- 典型值:车载屏幕常见60Hz,高端车型开始上120Hz甚至144Hz。
刷新率可以理解为「餐厅上菜的速度」。你的厨房(GPU)做得再快,如果服务员(显示器)只能每秒端60次菜,那多出来的菜也只能等着。
嗯,这里要注意:刷新率是硬件固定的。你没法让一块60Hz的屏幕突然变成120Hz。但帧率是软件可调的。
2.3 垂直同步(V-Sync)—— 协调者
垂直同步,英文V-Sync,全称Vertical Synchronization。它的作用很简单:让GPU在显示器完成一帧刷新后,再开始渲染下一帧。
为什么会需要这个?
你想想看,如果GPU不管不顾地拼命渲染,而显示器还在慢慢刷新,会发生什么?
我举个例子。假设显示器刷新率是60Hz,每16.67ms刷新一次。但GPU渲染一帧只用了10ms。那么GPU会在显示器还没刷新完当前帧时,就把新帧的数据写到显存里。结果就是——显示器上半部分显示的是旧帧,下半部分显示的是新帧。
这就是画面撕裂。
我的经验:在车载项目中,我一般建议对仪表盘这类关键显示区域强制开启V-Sync。虽然会引入一点点延迟,但画面完整性更重要。中控娱乐屏可以灵活处理,比如用三重缓冲来平衡。
2.4 画面撕裂(Tearing)—— 不协调的后果
画面撕裂,就是屏幕上同时出现了两帧或多帧的内容。典型表现是水平方向出现一条明显的错位线。
它的成因我刚才已经说了:GPU的渲染速度与显示器的刷新速度不同步。
| 场景 | 是否容易撕裂 | 原因 |
|---|---|---|
| 帧率 < 刷新率 | 不易撕裂 | GPU渲染慢,显示器有足够时间完成刷新 |
| 帧率 > 刷新率 | 极易撕裂 | GPU渲染太快,频繁覆盖显存内容 |
| 帧率 ≈ 刷新率 | 偶尔撕裂 | 微小的时间偏差累积导致 |
我曾经在一个项目中遇到过:客户投诉说导航地图在转弯时画面「裂开了」。排查后发现,是因为地图渲染线程跑得太快,而显示刷新跟不上。最后我们通过限制渲染帧率到58fps,完美解决了问题。
避坑指南:在车载多屏系统中,画面撕裂不仅仅是视觉问题。如果仪表盘上的车速数字出现撕裂,驾驶员可能在瞬间看到两个不同的数值——这是安全隐患。所以,安全相关的显示区域,必须做防撕裂处理。
2.5 卡顿(Jank)—— 另一种不流畅
卡顿和撕裂经常被混为一谈,但其实是两码事。
卡顿,指的是帧率突然下降,导致画面停顿或跳跃。比如你前一帧还是60fps,下一帧突然掉到20fps,人眼就会感觉到明显的「卡了一下」。
它的成因通常是:
- GPU瞬间负载过高(比如突然加载大量纹理)
- CPU被其他任务抢占(比如后台有垃圾回收)
- 内存带宽不足(比如同时读写显存)
- 驱动或系统调度延迟
我习惯用「帧间隔」来衡量卡顿。如果帧间隔稳定在16.67ms(对应60fps),那就是流畅的。一旦帧间隔突然跳到50ms,那就是一次明显的卡顿。
核心观点:稳定的低帧率(比如30fps)比忽高忽高的高帧率(比如60fps偶尔掉到20fps)体验更好。人眼对帧率变化的敏感度,远高于对绝对帧率的敏感度。
2.6 它们之间的关系
好,咱们把这些概念串起来。
帧率和刷新率是「生产」和「消费」的关系。垂直同步是协调机制。画面撕裂是不同步的结果。卡顿是生产不稳定的表现。
我画个简单的逻辑链:
GPU渲染速度(帧率) ≠ 显示器刷新速度(刷新率)
↓
开启V-Sync?
├── 是 → 等待同步 → 可能引入延迟,但画面完整
└── 否 → 画面撕裂(Tearing)
↓
帧率是否稳定?
├── 是 → 流畅体验
└── 否 → 卡顿(Jank)
在实际的车载多屏系统中,你面临的挑战是:每个屏幕可能有不同的刷新率(比如仪表60Hz、中控60Hz、副驾娱乐屏120Hz),而GPU只有一个。如何让一个渲染管线同时服务多个不同刷新率的屏幕?
这就是后面章节要讲的内容了。
一个小建议:如果你刚开始接触车载多屏开发,建议先在你的开发板上跑一个简单的测试程序。分别设置帧率为30fps、60fps、90fps,观察不同刷新率屏幕上的表现。亲手看到撕裂和卡顿,比看一百遍理论都管用。
好,这一节就到这里。下一节我们聊「多屏同步的核心挑战:时钟域与缓冲区管理」,我会分享一个我在实际项目中踩过的坑——两个屏幕的时钟差了0.5ms,结果画面错位了整整一行。