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

111 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LCD 边界测试动画
## 测试资源
测试动画包含 16 张 320×240 PNG,对应当前单次播放请求允许的最大帧序列长度。
文件名为:
```text
lcdtest00.png
lcdtest01.png
...
lcdtest15.png
```
每帧包含以下测试元素:
- 1 像素外边框和四色角标,用于检查裁切、偏移和方向;
- RGB565 基础色条,用于检查 RGB/BGR 色序和颜色异常;
- 连续移动的竖直白线和水平黄线,用于观察撕裂和跳帧;
- 旋转红色指针和移动方块,用于观察运动连续性;
- `F00`~`F15` 帧号,用于识别乱序和重复帧;
- 16 格进度条,用于识别丢帧;
- 4 位红绿二进制标记,用于辅助确认帧编号。
第 15 帧播放完后可以平滑回到第 0 帧。
## 真机触发
固件需要启用 Factory CLI。通过 UART0 发送:
```text
lcd_test
```
设备返回:
```text
OK
```
测试动画会:
- 立即打断当前普通动画;
- 先循环播放 `00 → 05`,再按 `00 → 15` 顺序循环;
- 每次全屏绘制后只等待 1 ms;
- 两个性能阶段各运行约 5 秒,总计约 10 秒(不含预热时间);
- 完成后自动返回待机动画。
1 ms 是额外等待时间,不代表 1000 FPS。实际帧率由 PNG 读取和解码、RGB565 转换、缓存命中情况以及 40 MHz SPI 全屏传输共同决定。
## 性能日志
测试会输出两条性能汇总日志,不会逐帧打印性能日志并干扰测试:
```text
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 传输错误。
## 重新生成测试帧
测试帧由确定性脚本生成:
```bash
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。