ESP32并口屏幕和串口屏幕下帧率的对比
前言
在嵌入式开发中,屏幕刷新率是用户体验的“第一生命线”。我一直好奇,为了追求高帧率,我们是应该把 60MHz 的 SPI“优化到极致”,还是应该直接“升维打击”,采用 8 位并口?为了搞清楚这个问题,我决定自费购买硬件来进行一次“原始对决”
测试项目
我特意选了两个‘不同维度’的测试:
- TFT_eSPI 的 graphicstest 是一个‘原始I/O’测试,它只测量‘总线’的吞吐速度。
- lv_demo_music 是一个‘真实世界’测试,它测量的是‘CPU渲染 + 总线I/O’的‘综合性能’
测试结果
运行LVGL自带的lv_demo_music
| 对照组序号 | 屏幕参数 | ESP32运行频率 | LVGL缓冲参数 | SPI速率 | TFT_eSPI版本 | LVGL版本 | 帧率 |
|---|---|---|---|---|---|---|---|
| 1 | 240x240 1.54寸 SPI LCD | 240MHz | 240*120 启用DMA,未使用双缓冲 | 60MHz | 2.3.70 | 8.1.1-dev | 26帧 |
| 2 | 240x240 1.33寸 8位并口 LCD | 240MHz | 240*120 未使用双缓冲 | \ | 2.3.70 | 8.1.1-dev | 28帧 |
感觉帧率差异不是很大的样子.
运行TFT_eSPI自带的Viewport_graphicstest
| 对照组序号 | 屏幕参数 | ESP32运行频率 | SPI速率 | TFT_eSPI版本 |
|---|---|---|---|---|
| 1 | 240x240 1.54寸 SPI LCD | 240MHz | 60MHz | 2.3.70 |
| 2 | 240x240 1.33寸 8位并口 LCD | 240MHz | \ | 2.3.70 |
运行时候明显感觉到并口的绘制速度更快,不过还是得数据说话,于是有如下Log
8位并口结果
1 | TFT_eSPI library test! |
串口结果
1 | TFT_eSPI library test! |
并口驱动情况下绘制时间几乎是串口驱动绘制时间的一半.
果然还是有提升的.
至于为什么在LVGL中拉不开差距,经过群友Principle点拨后意识到,运行LVGL时候CPU性能方面出现了瓶颈,我的ESP32是初代版本,如果换成最新的ESP32 S3则会拉开差距.
结论分析:CPU 瓶颈 vs I/O 瓶颈
从 TFT_eSPI(原始I/O)的日志看,结果一目了然:并口几乎快了一倍(例如 Screen fill 53,073μs vs 102,725μs)。
这证明了‘并口总线’存在明显的物理优势。
那么,为什么在‘真实世界’(LVGL)中,差距却微乎其微(26 vs 28 帧)? 这正揭示了 ESP32(初代)的真正瓶颈:CPU 渲染速度。
LVGL 的‘lv_demo_music’效果需要 CPU 大量计算,导致 CPU 100% 满载,而屏幕总线(无论是 SPI 还是并口)其实都在‘空闲等待’。
总结: 所以如果您的项目是‘重渲染’的,盲目升级屏幕接口是没用的,那就应该首先升级MCU(例如 ESP32-S3).
拓展阅读
后来我刷到过P佬的文章, 他从芯片维度去对比lvgl效果. 深入分析了一些CPU, Flash相关的内容, 受益匪浅.
推荐各位读者也去拜读一下((注:P佬博客的图床似乎挂了,但不影响文字的含金量))
AT32F403A试玩-移植LVGL并与ESP32-S3对比
ESP32并口屏幕和串口屏幕下帧率的对比