LVGL-注意事项
概述
在实际使用Quecpython LVGL的开发过程中,客户可能会遇到很多问题,本章总结一些开发者遇到的常见问题。
图片的选择与使用
注意:图片解码消耗RAM资源!
项目GUI不可避免要用到图片,Quecpython LVGL提供了三种图片格式的支持,分别是PNG,JPG和SJPG。
图片格式的优缺点
PNG
优点
无损格式,图片质量较好
支持透明
缺点
- 解码需要RAM资源大(图像宽度 x 图像高度 x 4字节)
- 解码时间较长(图片放四线外挂flash)
JPG
优点
- 较节省资源(解码需RAM:图像宽度 x 图像高度 x 3字节)
- 图片质量较好
缺点
- 不支持透明
- 优点同时也是缺点,画质比PNG差,解码消耗资源也较大
SJPG
SJPG 是LVGL自定义的一种基于普通” JPG 的格式,全称split-jpeg ,它是一段带有 sjpg 标头的小 jpeg 片段数据,它的大小将几乎与 jpg 文件相当,或者可能会稍大一些。
优点
- 节省资源(解码不需申请较大RAM空间)
缺点
- 不支持透明
- 画质较差
- 若图片放四线外挂flash,则加载慢
- 不适用图片缓存机制
图片格式的选择
首先看透明度需求,有透明度需求的直接选择PNG格式。
其次得分以下两种情况说明。
图片放内置flash或外挂六线flash
这种情况下,flash访问速度快,解码速度差距不大,对于客户而言,UI加载三种格式图片的速度差距不大。
请根据对画质的需求和资源分配权衡选择。
一般而言,若画质需求不强烈,可以选择SJPG,其次选择JPG,最后PNG;
若模块RAM资源富余,可以选择PNG,其次JPG,最后SJPG。
需要根据项目实际情况找到一个平衡点。
图片放外挂四线flash
外挂四线flash访问速度慢,UI图片较多的时候,对于客户而言,卡顿感知明显。
这种情况下,需要打开图片缓存机制,选择JPG或PNG格式,不能选择SJPG!
图片缓存机制
上文说到,外挂四线flash文件系统读取速度比较慢,LVGL图片解码也比较耗时,导致GUI显示卡顿。需要使用LVGL的图片缓存机制来解决。
使用方法
使用JPG或者PNG格式图片,在切换界面之前执行以下两步:
lv.img.cache_invalidate_src(None)
lv.img.cache_set_size(cache_num)
cache_num
- 需要缓存的图片数目,最大16。
注意:
- SJPG与图片缓存机制不兼容!因为SJPG的实质是很多块小图片。
- imgbtn组件不能使用图片缓存机制,不要使用imgbtn组件!
- 缓存的图片会占据RAM。
LVGL休眠场景
首先,在需要进入休眠模式的时候,务必确认外设是否停止交互,USB是否已断开,线程是否都已阻塞或挂起,否则无法进入休眠模式。
在确保上述条件满足的情况下,模块一般采取以下流程进休眠,其中背光关闭请根据硬件设计来对应的关闭。
import pm
import lvgl as lv
# Allow module to enter low-power mode in idle state
pm.autosleep(1)
# Allow LVGL to enter low-power mode in idle state
lv.autoSleep(1)
# LCD enters sleep state
lcd.lcd_display_off()
# Touchpad enters sleep state if exists
tp.suspend()
# Close LCD backlight if it can be controlled
退出休眠的时候执行相反的操作,如下。
import pm
import lvgl as lv
# Module exits from low-power mode
pm.autosleep(0)
# LVGL exits from low-power mode
lv.autoSleep(0)
# Wake LCD up
lcd.lcd_display_on()
# Wake touchpad up
tp.resume()
# Open lcd backlight if it can be controlled
其他注意事项
- 避免组件或者样式被gc回收,请将其定义为全局变量。
- 切换界面之前不要执行太多耗时操作,否则可能造成切换页面卡顿。
- 因LVGL底层限制,不要给一个组件多次的添加样式(add_style),超过64次会dump。
- 从heap消耗上看,图片解码会消耗大量的heap,建议尽量少用不必要的大图片。比如纯色背景和渐变色背景都可以使用lvgl的背景色来完成,没必要使用图片。