最近公司想测试一下ESP32S3的屏幕刷gif图片,将这个预研项目分派给我,我再论坛里面学习到很多,也来总结一下经验
硬件平台:ESP32S3
LCD:ILI9341
SPI:60Mbps
图片总数:400张
像素240*240
最简单的方式当然是不解码直接刷屏,速度肯定很快,动画速率就是刷屏速率,但是需要将所有的图片保存在flash中,有点离谱,总大小为40MB左右,显然不现实
然后又测试了gif解码器,单独移植了lvgl自带的gif三方库,这个gif解码器拉跨得很,特别占用RAM与时间,解码时间的长度和图像复杂度相关,最慢一帧可以来到350ms,简直没法使用,RAM占用情况:仅仅是缓存内外部就需要7*(像素点数量),240的放图大约占用400KB,esp32S3直接跑不起来,降低了分辨率才能跑起来
gif解码器我感觉再优化也不会有什么好的结果了,直接放弃
然后又想到jpg解码器,将所有的图片导出为jpg格式,总大小才3MB,比gif占用内存还小
第一次尝试了idf自带的ipg解码,名字叫做 tiny jpegdec,速度一张图大约消耗48ms,感觉不太好优化了
然后又移植了另一个解码器 JPEGDEC,同样的图片实测只要22ms,并且这个库对ESP32S3平台进行了SIMD优化,也就是运行一个指令支持修改多个数据,需要启动DSP,时间消耗来到了13ms,我对这个时间长度已经很满意了
开启双核心,用双缓存技术,一个核心解码 另一个核心刷屏,jpg的刷图速度就是刷屏速率
大佬们还有什么更有效的优化方式
不妨一起讨论讨论
离线
TJpgDec是针对内存最小化设计的,只需3.5KB RAM,在速度方面有所折衷。
JPEGDEC优化速度,但内存占用稍大,约20KB。
ESP自家的jpg编解码器是这个,
https://github.com/espressif/esp-adf-libs/tree/master/esp_new_jpeg
不开源,只有lib,实现细节不详。
内存占用10KB。
性能
ESP32S3
Decoder
The consume memory(10 kByte DRAM) is constant.
Rotate JPEG_ROTATE_0D cases:
Resolution Source Subsampling Source Quality Output Pixel Format Frames Per Second(fps)
1920 * 1080 JPEG_SUBSAMPLE_422 60 JPEG_PIXEL_FORMAT_RGB565_LE 3.27
1920 * 1080 JPEG_SUBSAMPLE_420 60 JPEG_PIXEL_FORMAT_RGB565_LE 3.78
1280 * 720 JPEG_SUBSAMPLE_422 60 JPEG_PIXEL_FORMAT_RGB565_LE 6.77
1280 * 720 JPEG_SUBSAMPLE_420 60 JPEG_PIXEL_FORMAT_RGB565_LE 7.82
800 * 480 JPEG_SUBSAMPLE_422 60 JPEG_PIXEL_FORMAT_RGB565_LE 14.73
800 * 480 JPEG_SUBSAMPLE_420 60 JPEG_PIXEL_FORMAT_RGB565_LE 16.87
640 * 480 JPEG_SUBSAMPLE_422 60 JPEG_PIXEL_FORMAT_RGB565_LE 17.90
640 * 480 JPEG_SUBSAMPLE_420 60 JPEG_PIXEL_FORMAT_RGB565_LE 20.46
480 * 320 JPEG_SUBSAMPLE_422 60 JPEG_PIXEL_FORMAT_RGB565_LE 32.27
480 * 320 JPEG_SUBSAMPLE_420 60 JPEG_PIXEL_FORMAT_RGB565_LE 36.29
320 * 240 JPEG_SUBSAMPLE_422 60 JPEG_PIXEL_FORMAT_RGB565_LE 58.95
320 * 240 JPEG_SUBSAMPLE_420 60 JPEG_PIXEL_FORMAT_RGB565_LE 66.28
离线
【ESP32S3_3.5寸QSPI屏_播放avi视频-哔哩哔哩】 https://b23.tv/P34oCJm
这个视频就是用的带SIMD的jpeg解码
离线
【ESP32S3_3.5寸QSPI屏_播放avi视频-哔哩哔哩】 https://b23.tv/P34oCJm
这个视频就是用的带SIMD的jpeg解码
莫工,我还在你的视频留言了,那个‘树莓好倒霉’就是我
你也可以尝试一下 esp_new_jpeg这个库,是乐鑫他们官方优化的,效果也很好
离线
@health
实际测试,解码240*240 一帧只需要 7~9毫秒
你好,我想请教个问题,esp_new_jpeg库对jpg格式有要求吗,如编码格式(渐变式or基线式)、颜色空间类型,
离线
树莓学LINUX 说:@health
实际测试,解码240*240 一帧只需要 7~9毫秒你好,我想请教个问题,esp_new_jpeg库对jpg格式有要求吗,如编码格式(渐变式or基线式)、颜色空间类型,
》(看了头文件,是支持不同格式的,不关格式的问题)
》有个新问题, ret = jpeg_dec_process(decoder, &io);一执行到这里就core panic,
1、任务栈分了15K,
2、jpegdata已经分配到psram里面(多张jpg共2.6MB)
3、其他函数返回正常,heap_caps_aligned_alloc(),jpeg_dec_open()
4、 jpeg_dec_config_t dec_cfg = {
.output_type = JPEG_PIXEL_FORMAT_RGB565_LE, /* 小端序 RGB565 */
.scale = {
.width = player->header.w,
.height = player->header.h
}
};
离线