超全面的Lvgl优化方案

前言

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)
1213.4674
917.4757
819.6451

估算数据:

时钟 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)
1276
957
851

对比实测数据和估算数据,两者基本一致,因此 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 优化策略

  1. 优化屏幕驱动

    1. 应根据屏幕规格书的要求,并结合项目的具体需求(特别是帧率),正确配置屏幕参数(如时钟、脉冲等)。

    2. 建议使用硬件加速功能,例如在 STM32 平台上采用 DMA2D,在 GD32 平台上则可利用 IPA 功能。

    3. 在选择屏幕接口时,应优先考虑并行通信方案(例如使用 RGB 接口替代 SPI 接口,或在使用 SPI 时将其配置为并行模式)。若因条件限制必须采用串行通信,则需确保设置的时钟频率足够高以满足性能需求。

  2. 优化 LVGL 配置

    1. 选择合适的缓存方案(官方的三种)

      1. 大部分场景方案 1+硬件加速就够用

      2. 双缓存的提升有限,但是会占用更多的内存。如果不刷全屏,其性能可能还不如刷全屏的方案 1

      3. 该方案省去了数据从 lvgl 缓存往屏幕显存搬运的过程,只需要修改显存地址。LVGL 有可能会分块刷屏,最好配合 lvgl“检测是否为最后一块内存”的API使用。

    2. 增加缓冲区的大小

    3. 把屏幕显存/lvgl 的缓存尽量放在内部 RAM,内部 RAM 的读写速度比 SDRAM 更快,屏幕显存和缓存都经常访问,最好有更快的读写速度。

    4. 如果数据存储在外部 SDRAM,SDRAM 的驱动配置(读写速率)可能是性能突破瓶颈的关键

    5. 避免显存和缓存都存储在 SDRAM 占用带宽。 如果屏幕显存和 lvgl 缓存都放在 SDRAM,在条件允许的情况下,可以将其中一个放到内部 RAM。

    6. 分配足够的内存,起码大于 48K,最好 96K 以上(用于生成组件等),可以通过开启内存调试的宏定义来判断内存分配是否足够。

  3. 采用 LVGL 的基准测试工具(Benchmark)对显示屏及其 LVGL 驱动程序进行评估,根据结果进行针对性的优化与问题解决。

  4. LVGL 开发优化

    1. 尽量使用完全不透明/完全透明组件

    2. 如果使用半透明组件,尽量减少数量与面积

    3. 使用特定的组件去实现特定的功能有更好的优化效果,比如:相比于容器,滚动条使用列表和滑动页实现会有更好的优化效果

    4. 字体和图片在使用位图方案的时候,尽量避免较大图案和字体,比如全屏背景图和超过 50 字号的字体等

    5. 内存足够的情况下,常用的屏幕在切换时可以保留内存

    6. 减少动画的使用

    7. 简单的屏幕不放置容器效率更高,复杂的屏幕放置容器方便管理和复用

    8. 方形组件减少阴影和倒角效率更高

  5. 提升编译器等级,可以获得更好的显示效果

  6. 选择屏幕时尽量选用硬件方案,软件旋转方案会降低帧率

参考资料

欢迎阅读LVGL中文开发手册! — LVGL 文档

Moticsoft的个人空间-Moticsoft个人主页-哔哩哔哩视频

2-13-4_LVGL-MCU进阶教程之对接显示驱动到LVGL库(再次优化刷新效率)哔哩哔哩bilibili

7节技术精品课:让你的微控制器GUI开发技能从入门到精通!哔哩哔哩bilibili

##

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值