4.1 KiB
4.1 KiB
LCD 边界测试动画
测试资源
测试动画包含 16 张 320×240 PNG,对应当前单次播放请求允许的最大帧序列长度。
文件名为:
lcdtest00.png
lcdtest01.png
...
lcdtest15.png
每帧包含以下测试元素:
- 1 像素外边框和四色角标,用于检查裁切、偏移和方向;
- RGB565 基础色条,用于检查 RGB/BGR 色序和颜色异常;
- 连续移动的竖直白线和水平黄线,用于观察撕裂和跳帧;
- 旋转红色指针和移动方块,用于观察运动连续性;
F00~F15帧号,用于识别乱序和重复帧;- 16 格进度条,用于识别丢帧;
- 4 位红绿二进制标记,用于辅助确认帧编号。
第 15 帧播放完后可以平滑回到第 0 帧。
真机触发
固件需要启用 Factory CLI。通过 UART0 发送:
lcd_test
设备返回:
OK
测试动画会:
- 立即打断当前普通动画;
- 先循环播放
00 → 05,再按00 → 15顺序循环; - 每次全屏绘制后只等待 1 ms;
- 两个性能阶段各运行约 5 秒,总计约 10 秒(不含预热时间);
- 完成后自动返回待机动画。
1 ms 是额外等待时间,不代表 1000 FPS。实际帧率由 PNG 读取和解码、RGB565 转换、缓存命中情况以及 40 MHz SPI 全屏传输共同决定。
性能日志
测试会输出两条性能汇总日志,不会逐帧打印性能日志并干扰测试:
LCD sequence perf asset=lcd_boundary_test mode=cache_hit working_set=6 cache_capacity=6 frames=120 elapsed_ms=5010 fps=23.95 draw_us_avg=40680 draw_us_min=39520 draw_us_max=48760 hold_ms=1
LCD sequence perf asset=lcd_boundary_test mode=cache_thrash working_set=16 cache_capacity=6 frames=38 elapsed_ms=5020 fps=7.56 draw_us_avg=131960 draw_us_min=108305 draw_us_max=343547 hold_ms=1
cache_hit 阶段开始计时前会把第 0~5 帧解码并装入 6 帧缓存,计时期间直接从缓存读取 RGB565 数据。cache_thrash 阶段开始计时前会把第 10~15 帧装入缓存,使第 0 帧开始的 16 帧顺序播放持续发生缓存淘汰和重新解码。预热耗时不计入两个阶段的 FPS。
为避免时钟、充电和低电量图标占用同一组图片缓存槽位,边界测试帧不绘制这些运行时叠加层。普通动画的叠加层行为不受影响。
字段含义:
| 字段 | 含义 |
|---|---|
mode |
cache_hit 表示缓存命中;cache_thrash 表示工作集超过缓存容量 |
working_set |
当前阶段循环使用的不同图片数量 |
cache_capacity |
编译时配置的图片缓存槽位数量 |
frames |
已经完成 SPI 传输的全屏帧数 |
elapsed_ms |
整段测试的实际墙钟时间 |
fps |
frames ÷ elapsed_ms 得到的真实平均帧率 |
draw_us_avg |
平均每帧读取、解码、转换和 SPI 传输耗时 |
draw_us_min |
最快一帧的绘制耗时 |
draw_us_max |
最慢一帧的绘制耗时 |
hold_ms |
每帧绘制完成后的配置等待时间 |
示例数值仅用于说明日志格式,必须以真机输出为准。
两组结果的用途不同:
cache_hit更接近 RGB565 帧已经在内存中时,LCD 合成与 SPI 全屏传输的速度上限;cache_thrash代表长动画超过缓存容量后,Flash 读取、PNG 解码、RGB565 转换和 SPI 传输叠加的实际速度。
观察方法
重点观察:
- 帧号是否严格按
F00到F15循环。 - 白色竖线和黄色横线是否连续移动。
- 指针是否匀速旋转,是否出现明显停顿或倒退。
- 屏幕边框和四角标记是否完整可见。
- 顶部色条颜色是否正确。
- 快速运动过程中是否出现上下区域属于不同帧的撕裂。
- 串口日志中是否出现 PNG 解码失败、资源缺失或 LCD 传输错误。
重新生成测试帧
测试帧由确定性脚本生成:
python tools/generate_lcd_boundary_frames.py
python tools/optimize_lcd_assets.py generate
python tools/optimize_lcd_assets.py verify
idf.py build
生成脚本需要 Pillow。普通固件构建仍然不需要 Pillow。