公司动态

ST7701( mipi ) lvgl调优

📅 2026/8/29 5:29:05
ST7701( mipi ) lvgl调优
帧率优化LVGL运行太慢这样做可最大化帧率 | LVGL Too Slow? Do THIS for Maximum FPS!方法1LVGL内部有一个定时器会以固定的周期调用lv_timer_handler()来执行界面更新和动画渲染。通过修改这个周期就可以直接控制理论上的最大帧率。这个周期由sdkconfig宏CONFIG_LV_DEF_REFR_PERIOD定义单位是毫秒(ms)。默认值通常是33ms对应约30 FPS。调整方法很简单在项目根目录下运行idf.py menuconfig然后依次进入Component config→LVGL Configuration→LV_DEF_REFR_PERIOD修改其数值即可不同数值对应的帧率效果参考更大值如50ms→对应更低帧率如20 FPS能有效降低CPU占用但动画会显得卡顿33→默认值对应约 30 FPS是性能与流畅度的平衡点-16 → ≈60 FPS15→对应约 66 FPS更流畅但也更消耗CPU资源10 → ≈100 FPS5 → ≈200 FPS方法2EXAMPLE_LVGL_TASK_MIN_DELAY_MS — 任务循环最小间隔#define EXAMPLE_LVGL_TASK_MIN_DELAY_MS 1000 / CONFIG_FREERTOS_HZ这个值取决于 FreeRTOS 的 tick 频率。如果 CONFIG_FREERTOS_HZ1000则最小间隔为 1ms。方法3任务循环中的帧率限制time_till_next_ms lv_timer_handler(); time_till_next_ms MAX(time_till_next_ms, EXAMPLE_LVGL_TASK_MIN_DELAY_MS); // 下限 time_till_next_ms MIN(time_till_next_ms, EXAMPLE_LVGL_TASK_MAX_DELAY_MS); // 上限 usleep(1000 * time_till_next_ms);实践建议找到平衡点从默认的33ms (30 FPS)开始测试。如果感觉动画不够流畅可尝试减小到20ms (50 FPS)或15ms (66 FPS)。如果CPU负载过高则适当增大该值。优化先行CONFIG_LV_DEF_REFR_PERIOD调整的是“上限”。实际帧率还受绘图复杂度、缓冲区大小、CPU频率等多种因素限制。在调整刷新率前建议先确保缓冲区大小、CPU频率、编译器优化等级等基础配置是合理的。防止撕裂优化“锁帧”与显示效果除了调整刷新周期还有一些相关的配置项会影响最终的显示效果和性能。防撕裂Tearing Control在esp_lvgl_adapter组件中提供了多种防撕裂模式。正确的配置可以避免画面撕裂让“锁帧”后的画面更稳定。缓冲区Frame Buffer大小LVGL缓冲区的大小是影响性能的最关键因素。缓冲区过小会严重拖累帧率但过大超过屏幕尺寸的25%带来的性能提升会边际递减。需要根据你的屏幕分辨率和可用内存来合理配置。LVGL任务周期esp_lvgl_adapter启动后会创建一个任务来驱动LVGL。你可以通过调整这个任务的延时间接控制刷新率。例如通过定义EXAMPLE_LVGL_TASK_MAX_DELAY_MS和EXAMPLE_LVGL_TASK_MIN_DELAY_MS等宏可以精细控制LVGL任务的执行频率。硬件加速器如果你的芯片是ESP32-P4可以启用其自带的像素处理加速器PPA。通过开启CONFIG_LV_USE_PPA等配置可以将图形渲染任务如矩形填充、图像缩放卸载给硬件从而在锁定帧率的同时用更少的CPU资源实现目标帧率。多线程安全在FreeRTOS等多线程环境下操作LVGL必须使用互斥锁Mutex来保证线程安全。esp_lvgl_adapter提供了esp_lv_adapter_lock()/esp_lv_adapter_unlock()API。建议在调用任何LVGL绘图API前后都加上锁防止因资源竞争导致崩溃。参考例程Espressif 提供了esp_lvgl_adapter组件和示例可以参考其实现尤其是关于防撕裂和任务调度的部分。创建分区表文件CONFIG_PARTITION_TABLE_CUSTOMyflash设置CONFIG_ESPTOOLPY_FLASHSIZE_16MBy