Files
lucky-cat/docs/lcd-boundary-test.zh-CN.md
T

4.1 KiB
Raw Blame History

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 传输叠加的实际速度。

观察方法

重点观察:

  1. 帧号是否严格按 F00 到 F15 循环。
  2. 白色竖线和黄色横线是否连续移动。
  3. 指针是否匀速旋转,是否出现明显停顿或倒退。
  4. 屏幕边框和四角标记是否完整可见。
  5. 顶部色条颜色是否正确。
  6. 快速运动过程中是否出现上下区域属于不同帧的撕裂。
  7. 串口日志中是否出现 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。