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在每一帧需要做的事情是:

  1. 遍历所有可见对象,计算它们的新位置、新状态。
  2. 把所有脏区域(需要重绘的部分)收集起来。
  3. 调用底层驱动,把像素数据刷到屏幕上。

第三步是最耗时的。因为你要往屏幕上写像素,而像素的总数就是 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 一张图看懂:帧率、刷新率、分辨率的关系

下面这张图,是我自己总结的。它把这三者的关系讲得很清楚。

帧率、刷新率、分辨率关系图 帧率、刷新率、分辨率关系图 屏幕刷新率 60 Hz(固定) 软件渲染 FPS(可变) 分辨率 LV_HOR_RES x LV_VER_RES 限制上限 决定负载 分辨率越高,每帧耗时越长,实际FPS越低 关键公式 每帧可用时间 = 1000ms / 刷新率(Hz) 实际FPS = 1000ms / 每帧实际耗时

从这张图你可以看到:

  • 刷新率是固定的天花板,决定了每帧最多有多少时间。
  • 分辨率决定了每一帧需要处理多少像素数据,直接影响渲染耗时。
  • FPS是实际表现,取决于你的软件能不能在刷新周期内完成工作。

所以,60Hz屏幕卡顿的根本原因,不是屏幕不行,而是你的软件没能在16.67ms内完成一帧的渲染和传输。

3.5 小结

这一章我们理清了三个核心概念:

  • Hz是硬件的刷新能力,FPS是软件的实际帧率。两者不能划等号。
  • LV_HOR_RES和LV_VER_RES决定了每帧的数据量。分辨率越高,渲染压力越大。
  • 60Hz屏幕卡顿,是因为软件渲染耗时超过了16.67ms。