前言
LVGL: V8.3.10
开发工具:NXP GUI-Guider-1.8.1-GA
MCU:GD32F470ZIT6
屏幕:4.3 寸 tftlcd 480*272 RBG565
触摸: GT911
操作系统:FreeRTOS
本文记录分享一个实际项目中 lvgl 的优化过程。
现象
屏幕移植 lvgl 后帧率 50fps 左右,但是当切换屏幕、容器滑动滑动条(都是动画)时,帧率显著下降到 15fps 左右。
解耦屏幕驱动 lvgl freertos
驱动验证
任务启动调度和 lvgl 初始化之前,运行屏幕驱动测试用例,使用 TLI+IPA 的驱动方案。
测试数据如下:
| 时钟频率 (MHz) | 刷全屏时间 (ms) | 帧率(fps) |
|---|---|---|
| 12 | 13.46 | 74 |
| 9 | 17.47 | 57 |
| 8 | 19.64 | 51 |
估算数据:
时钟 12MHZ 时,帧率:12000000/(480*272*1.2) ≈ 76 fps
时钟 9MHZ 时,帧率:9000000/(480*272*1.2) ≈ 57 fps
时钟 8MHZ 时,帧率:8000000/(480*272*1.2) ≈ 51 fps
| 时钟频率 (MHz) | 帧率 (fps) |
|---|---|
| 12 | 76 |
| 9 | 57 |
| 8 | 51 |
对比实测数据和估算数据,两者基本一致,因此 TLI+IPA 的驱动方案可以驱动屏幕达到各个频率下的最大帧率。
lvgl 移植验证
使用 lvgl 的 demos 测试:brenchmark 验证驱动程序。
lvgl 使用单缓存,全屏,画点填充的测试如下:

lvgl 使用单缓存,全屏,IPA 点填充的测试如下:

从对比看出,IPA 的方案的明显更优。
单缓存非全屏,双缓存非全屏测试时撕裂感较为明显,两者的全屏缓存撕裂感消失。网友说双缓存会更慢,gd32f4 的芯片一般单缓冲就够,暂时放弃双缓存。lvgl 第三种缓存方式为全屏双缓存,省掉了 lvgl 缓存往 TLI 显存搬运数据的过程,通过不断修改 TLI 显存地址实现,撕裂感消失,但是帧率下降为 10fps 左右,并且屏幕闪动(使用了lv_disp_flush_is_last() 检测是最后渲染的块,无好转 )。所有最后 lvgl 使用单缓存,全屏,IPA 搬运数据的方案。
问题分析与解决
验证完驱动和 lvgl,优化的目标应该放在 guider 生成的代码上,brenchmark 显示阴影、文本和半透明度会降低帧率。
brenchmark 的结果显示半透明度组件会降低渲染效率 14%,guider 工程中使用了多处半透明组 LVGL 组件的不同透明度对性能的影响
方案 1:减少半透明组件的数量和使用面积。测试发现帧率有所提升。
容器的滑动条滚动时帧率显著降低,从 50fps 降低到 15fps。相同的功能可以通过列表、滑动页来实现。虽然使用列表组件是最简单的方案,但是项目中的UI设计使用列表难以实现。容器在滚动条方面的优化都不如列表和滑动页。
方案 2:使用滑动页代替容器。测试后帧率不再下降,稳定在 66fps。
| 选择 | 适用场景 | 描述 |
|---|---|---|
| 列表 | 列表式的内容(如菜单、选项) | 已经高度优化,默认样式和行为适合大多数列表场景。 |
| 滑动页 | 内容复杂且需要大面积滚动 | 滚动优化的通用容器。 |
| 容器 | 需要完全自定义内容和布局 | 手动启用滚动功能(如 lv_obj_set_scroll_dir),但性能和滚动行为需要更多调试和优化。 |
总结
Lvgl 优化策略
-
优化屏幕驱动
-
应根据屏幕规格书的要求,并结合项目的具体需求(特别是帧率),正确配置屏幕参数(如时钟、脉冲等)。
-
建议使用硬件加速功能,例如在 STM32 平台上采用 DMA2D,在 GD32 平台上则可利用 IPA 功能。
-
在选择屏幕接口时,应优先考虑并行通信方案(例如使用 RGB 接口替代 SPI 接口,或在使用 SPI 时将其配置为并行模式)。若因条件限制必须采用串行通信,则需确保设置的时钟频率足够高以满足性能需求。
-
-
优化 LVGL 配置
-
选择合适的缓存方案(官方的三种)
-
大部分场景方案 1+硬件加速就够用
-
双缓存的提升有限,但是会占用更多的内存。如果不刷全屏,其性能可能还不如刷全屏的方案 1
-
该方案省去了数据从 lvgl 缓存往屏幕显存搬运的过程,只需要修改显存地址。LVGL 有可能会分块刷屏,最好配合 lvgl“检测是否为最后一块内存”的API使用。
-
-
增加缓冲区的大小
-
把屏幕显存/lvgl 的缓存尽量放在内部 RAM,内部 RAM 的读写速度比 SDRAM 更快,屏幕显存和缓存都经常访问,最好有更快的读写速度。
-
如果数据存储在外部 SDRAM,SDRAM 的驱动配置(读写速率)可能是性能突破瓶颈的关键
-
避免显存和缓存都存储在 SDRAM 占用带宽。 如果屏幕显存和 lvgl 缓存都放在 SDRAM,在条件允许的情况下,可以将其中一个放到内部 RAM。
-
分配足够的内存,起码大于 48K,最好 96K 以上(用于生成组件等),可以通过开启内存调试的宏定义来判断内存分配是否足够。
-
-
采用 LVGL 的基准测试工具(Benchmark)对显示屏及其 LVGL 驱动程序进行评估,根据结果进行针对性的优化与问题解决。
-
LVGL 开发优化
-
尽量使用完全不透明/完全透明组件
-
如果使用半透明组件,尽量减少数量与面积
-
使用特定的组件去实现特定的功能有更好的优化效果,比如:相比于容器,滚动条使用列表和滑动页实现会有更好的优化效果
-
字体和图片在使用位图方案的时候,尽量避免较大图案和字体,比如全屏背景图和超过 50 字号的字体等
-
内存足够的情况下,常用的屏幕在切换时可以保留内存
-
减少动画的使用
-
简单的屏幕不放置容器效率更高,复杂的屏幕放置容器方便管理和复用
-
方形组件减少阴影和倒角效率更高
-
-
提升编译器等级,可以获得更好的显示效果
-
选择屏幕时尽量选用硬件方案,软件旋转方案会降低帧率
参考资料
Moticsoft的个人空间-Moticsoft个人主页-哔哩哔哩视频
##
1089

被折叠的 条评论
为什么被折叠?



