3. 帧率与刷新率的核心概念:FPS与Hz的区别,LVGL的LV_VER_RES/ LV_HOR_RES与刷新率的关系,为什么60Hz屏幕也会卡。
好,我们进入第三章。这一章聊点基础,但也是很多新手栽跟头的地方。
帧率、刷新率,这两个词你肯定听过。但你真的搞懂它们的区别了吗?我见过不少工程师,一上来就说“我屏幕是60Hz的,所以LVGL跑60帧没问题”。结果一跑起来,卡成PPT。为什么会这样?
说白了,Hz是硬件的上限,FPS是软件的实际表现。两者不是一回事。
3.1 FPS与Hz:一个是能力,一个是表现
先讲个我自己的经历。几年前我做一款智能家居面板,屏幕参数写着60Hz。我当时想,60Hz嘛,一秒钟刷新60次,那我LVGL的动画也按60帧来设计,肯定丝滑。结果呢?实际跑起来只有30多帧,肉眼可见的卡顿。
后来我才彻底搞明白:Hz是屏幕的物理刷新能力,FPS是软件渲染的实际帧率。
| 概念 | 全称 | 含义 | 谁决定的 |
|---|---|---|---|
| Hz(刷新率) | Hertz | 屏幕每秒从顶部到底部刷新画面的次数 | 硬件(屏幕面板、驱动IC) |
| FPS(帧率) | Frames Per Second | 软件(GPU/CPU)每秒渲染并提交给屏幕的帧数 | 软件(渲染管线、CPU负载) |
你想想看,屏幕的刷新率是固定的,60Hz就是一秒钟固定刷新60次。但你的软件能不能在每一次刷新前准备好一帧画面?这才是关键。
如果软件只能每秒渲染30帧,那屏幕虽然还在以60Hz刷新,但其中一半的刷新周期里,画面根本没变。这就是卡顿的根源。
核心结论:Hz是屏幕的“天花板”,FPS是软件能摸到的高度。FPS永远不可能超过Hz,但FPS远低于Hz时,卡顿就来了。
3.2 LVGL中的分辨率宏:LV_VER_RES与LV_HOR_RES
好,那LVGL里怎么跟刷新率打交道?
LVGL有两个宏:LV_VER_RES 和 LV_HOR_RES。它们定义的是屏幕的垂直和水平分辨率。比如你的屏幕是480x320,那 LV_HOR_RES = 480,LV_VER_RES = 320。
这两个宏跟刷新率有关系吗?有,而且关系很大。
我举个例子你就明白了。假设屏幕是60Hz,分辨率是480x320。LVGL在每一帧需要做的事情是:
- 遍历所有可见对象,计算它们的新位置、新状态。
- 把所有脏区域(需要重绘的部分)收集起来。
- 调用底层驱动,把像素数据刷到屏幕上。
第三步是最耗时的。因为你要往屏幕上写像素,而像素的总数就是 LV_HOR_RES * LV_VER_RES。分辨率越高,每一帧需要搬运的数据量就越大。
我的经验:在低端MCU上(比如Cortex-M4不带硬件JPEG/GPU),480x272的分辨率跑60Hz已经非常吃力了。我建议你一开始就评估一下:你的MCU能不能在16.67ms(60Hz的周期)内完成一帧的渲染和刷新?如果不行,要么降分辨率,要么降帧率。
3.3 为什么60Hz屏幕也会卡?
这个问题我当年也困惑了很久。明明屏幕参数写着60Hz,为什么LVGL跑起来就是卡?
原因其实就三个字:来不及。
我们来拆解一下。60Hz屏幕,每一帧的可用时间是:
1秒 / 60 = 16.67毫秒
也就是说,你的软件必须在16.67ms内完成:
- LVGL的任务处理(
lv_task_handler()) - 脏区域的重绘
- 数据通过SPI/8080接口/DSI等总线传输到屏幕
如果这三步加起来超过16.67ms,那屏幕就会错过这一帧。等下一帧来的时候,画面还是上一帧的内容。这就是卡顿。
我遇到过最典型的情况是:
- 用了大尺寸的图片(比如全屏背景图),每次重绘都要搬运几十KB的数据。
- SPI时钟频率没配好,导致传输速度只有几MB/s。
- LVGL的刷新模式没选对,用了全屏刷新而不是局部刷新。
这些都会让一帧的耗时远超16.67ms。
避坑指南:我曾经在一个项目里,屏幕分辨率是800x480,SPI时钟配到了40MHz。理论上传输一帧数据只需要:800 * 480 * 2字节(RGB565)/ 40Mbps ≈ 19.2ms。已经超过16.67ms了!所以哪怕屏幕是60Hz,实际帧率也只能跑到50FPS左右。后来我换成了RGB接口的屏幕,才真正跑满60FPS。
3.4 一张图看懂:帧率、刷新率、分辨率的关系
下面这张图,是我自己总结的。它把这三者的关系讲得很清楚。
从这张图你可以看到:
- 刷新率是固定的天花板,决定了每帧最多有多少时间。
- 分辨率决定了每一帧需要处理多少像素数据,直接影响渲染耗时。
- FPS是实际表现,取决于你的软件能不能在刷新周期内完成工作。
所以,60Hz屏幕卡顿的根本原因,不是屏幕不行,而是你的软件没能在16.67ms内完成一帧的渲染和传输。
3.5 小结
这一章我们理清了三个核心概念:
- Hz是硬件的刷新能力,FPS是软件的实际帧率。两者不能划等号。
- LV_HOR_RES和LV_VER_RES决定了每帧的数据量。分辨率越高,渲染压力越大。
- 60Hz屏幕卡顿,是因为软件渲染耗时超过了16.67ms。