rt,
lvgl加载图片的方式似乎是全图缓存,再刷新?
也就是小图能打开, 大图要么显示一半有花屏加no data,要么直接no data.
并且没有LV_IMG_CACHE_DEF_SIZE直接崩掉(内存不足)
有没有办法分开批次读取一个图片?
我想使用stm32f407(或者国产平替)系列去刷新一张150KB左右的图片.但是能留给缓冲的区域只有几十KB.
本来想用画布来完成,仔细一看也是要缓冲区.
rt,
lvgl加载图片的方式似乎是全图缓存,再刷新?
也就是小图能打开, 大图要么显示一半有花屏加no data,要么直接no data.
并且没有LV_IMG_CACHE_DEF_SIZE直接崩掉(内存不足)
有没有办法分开批次读取一个图片?
我想使用stm32f407(或者国产平替)系列去刷新一张150KB左右的图片.但是能留给缓冲的区域只有几十KB.
本来想用画布来完成,仔细一看也是要缓冲区.
我现在也遇到这个问题,貌似都是需要全图缓存!
既然号称是对MCU要求不高,不知道为什么要搞个全图缓存?存什么都要开一个和图片一样大小的缓存,这个设计有点naocan!
如果不用LVGL,直接裸屏驱动,把150K分成三等分,每份50K,然后只需开辟一个50K的数组就可以了。然后用set_windows设置一个150K的区域,分三次,每次送50K就可以了,非常简单。
在LVGL上复杂了,不知道还能不能实现。。。LVGL这玩意还不成熟,资料又少,,,,
我刚也看了你的帖子,只能说MCU不是很适合lvgl做图显和视频。
我补充一下lvgl关于图片解析的内存需求。
jpg:宽x高x3字节
png:宽x高x4字节
也就是说一张小小的图片就消耗远大于实际显存的内存。
实测280*158的jpg图片(图片实际所需显存88KB),在开启lvgl图片缓存的基础上消耗130KB的内存。jpg可以不开启缓存来显示,此时刷新完后内存就释放了,但是刷新速度极其地慢!而同样大小的png直接no data。
我现在有一个解决思路是只能开画布,画布所需显存大概是宽x高x2(rgb565),应该是这样吧我还没试好。当需要显示时在外部申请宽x高x2的内存(我的屏幕小,勉强够,但是得牺牲刷屏速度),把这个区域的指针付给画布buffer。解码后的rgb565直接输送到内存里,不知道可不可以自动刷新。正在试。
如果是你的需求,图片将近或大于lvgl能申请到的最大内存那可能真就是无解,或者自己设计一套底层刷屏函数了。我是真不愿意修改lvgl的底层,我本来也想分批次刷一张图。
我搞出来视频播放了.但是你这个视频传输我不知道行不行,
看你这个做的还是挺流畅的,我的图像出来了,但是画面是静止的,不是动态的,你这个是怎么实现动态刷新的?我用定时器每隔5ms刷新一次,画面是动起来了,但是卡的不行,CPU直接飙升到100%, 我感觉这个刷新不应该使用定时器来做的,但又不知道如何实现。
我也用lv_obj_invalidate();这个函数试过,没反应,画面还是静止的,如何能实现动态刷新呢
我这才多大分辨率,理论上280*158差不多极限能有20+帧左右。
你的分辨率大并且还要对图像进行处理或者搬运,这个是耗时大头。
我的动态刷新是调用画布设置buffer那个接口实现的,每一针都调用一次。
MCU的定时器设置一个标志位,LVGL用一个Timer检测定时器输出的标志,ok就执行设置buffer。你试试这样?
我就是按你这种方法做的,卡的不行,估计是分辨率太大,再加上大量的浮点运算占了太多时间,怎么优化都不行,MCU性能跟不上,看来LVGL+MCU+视频/图像处理确实行不通,准备放弃了,准备用Cortex-A7/A8这类MPU+Linux+LVGL来试一下。
所以说啊MCU干这种高不成低不就的任务太难了。试试开启硬件浮点或者用专用的浮点运算库,增加优化代码等级,还有一个运行时间优化也可以开,但是我开了就不显示了。