2、帧率测量:用LVGL内置工具量化当前帧率
做性能优化,第一件事就是搞清楚现状。
你想想看,如果连当前跑多少帧都不知道,那优化就成瞎蒙了。我个人习惯是,拿到一个新项目,先不管三七二十一,把帧率测出来再说。这就像医生看病先量体温一样,是个基本功。
2.1 为什么帧率这么重要?
帧率,说白了就是每秒能刷新多少帧画面。单位是fps(Frames Per Second)。
人眼看动画觉得流畅,一般需要30fps以上。要是掉到20fps以下,卡顿感就非常明显了。我遇到过不少项目,开发阶段在模拟器上跑得飞起,一上真机就卡成PPT。为什么?因为模拟器不反映真实硬件性能。
核心指标:LVGL动画建议稳定在30fps以上,60fps是理想目标。低于20fps就需要立刻优化。
2.2 LVGL内置的帧率测量工具
LVGL其实自带了两套测量手段。一套是软件层面的,一套是硬件层面的。我们先说软件层面的。
2.2.1 使用性能监控宏
LVGL在 lv_conf.h 里提供了几个调试宏。打开它们,就能看到帧率、CPU占用、内存使用等关键数据。
/* 在 lv_conf.h 中开启 */
#define LV_USE_PERF_MONITOR 1
#define LV_USE_MEM_MONITOR 1
开启后,屏幕上会叠加显示一个性能小窗口。里面包含:
- FPS:当前帧率
- CPU:LVGL任务占用的CPU百分比
- MEM:动态内存使用情况
嗯,这里要注意。这个性能窗口本身也会消耗一点点性能。但影响微乎其微,调试阶段完全可以忽略。
我的经验:我曾经在一个项目里,开了性能监控后发现CPU占用一直飙到90%以上。排查了半天,发现是一个定时器任务在疯狂重绘整个屏幕。关了性能监控,问题依旧。所以性能监控不会掩盖问题,它只是帮你发现问题。
2.2.2 使用 lv_disp_get_antialiasing
这个函数名字带antialiasing(抗锯齿),但它其实能帮你获取显示驱动的一些底层信息。不过,直接用它测帧率并不方便。我更推荐用性能监控宏。
那为什么还要提它?因为有些场景下,性能监控宏可能被禁用了(比如为了节省ROM空间)。这时候,你可以手动计算帧率。
/* 手动帧率测量示例 */
static uint32_t last_tick = 0;
static uint32_t frame_count = 0;
static float fps = 0.0f;
void my_flush_callback(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
/* 你的硬件刷新代码 */
frame_count++;
uint32_t current_tick = lv_tick_get();
if(current_tick - last_tick >= 1000) { /* 每秒统计一次 */
fps = (float)frame_count * 1000.0f / (current_tick - last_tick);
LV_LOG_USER("Current FPS: %.1f", fps);
frame_count = 0;
last_tick = current_tick;
}
lv_disp_flush_ready(disp_drv);
}
这段代码的原理很简单:在刷新回调里计数,每秒算一次平均值。我建议你把fps值打印出来,或者显示在屏幕某个角落。
2.3 帧率数据的解读
拿到帧率数据后,怎么判断好坏?我整理了一个参考表:
| 帧率范围 | 体验感受 | 优化建议 |
|---|---|---|
| 55-60 fps | 非常流畅 | 无需优化,保持即可 |
| 30-55 fps | 基本流畅 | 可以优化,但非必须 |
| 20-30 fps | 轻微卡顿 | 建议优化,检查渲染瓶颈 |
| 低于20 fps | 明显卡顿 | 必须优化,优先检查双缓冲和刷新策略 |
避坑指南:我曾经遇到一个情况,帧率显示30fps,但动画看起来就是卡。后来发现是帧率波动太大——有时候60fps,有时候10fps,平均值被拉高了。所以不要只看平均值,还要关注帧率的稳定性。如果帧率忽高忽低,说明系统负载不稳定,需要排查中断或高优先级任务。
2.4 帧率测量的知识体系
我把帧率测量的核心逻辑画了张图,方便你理解:
2.5 实战建议
说了这么多,总结几条我实际项目中的经验:
- 先开性能监控宏。这是最快的方式,几秒钟就能看到帧率。
- 记录基准帧率。在没有任何动画、只有静态界面的情况下,先测一个基准值。这个值代表你的硬件刷新上限。
- 逐步增加动画。每加一个动画,观察帧率变化。这样能快速定位是哪个动画拖慢了系统。
- 注意帧率波动。如果帧率在30-60之间剧烈跳动,说明系统负载不稳定。这时候要检查是否有高优先级中断或任务在抢占CPU。
一个小技巧:我习惯在屏幕角落固定显示帧率,哪怕是在发布版本中。当然,发布版本会用更低调的方式显示,比如一个小圆点,绿色代表流畅,红色代表卡顿。这样现场测试时,一眼就能看出问题。