perf(lcd): precompose emote updates and smooth closed eyes

This commit is contained in:
chenjintao
2026-10-09 15:05:05 +08:00
parent e75846ea15
commit b5c8aeb4fe
3 changed files with 264 additions and 41 deletions
+21 -1
View File
@@ -22,7 +22,7 @@
- 右上百分比和电池;未知值显示 --%,充电绿色并带闪电缺口,低电量红色。
- SOC、有效性和充电状态来自现有 domain battery 服务,不从 ADC 重算。
- GFX 顶部 320x40 RGB565 图层,常驻 25,600 B PSRAM;只在分钟或电池状态
改变时使图层失效并刷新,眨眼仍只改变眼睛网格,不解码新 PNG。
改变时使图层失效并刷新,眨眼主要改变眼睛网格,接近闭合时切换为程序绘制的抗锯齿弧线,不解码新 PNG。
- PNG 表情复用相同点阵 / 电池绘制器,在每帧合成时更新;二维码和 LCD
边界测试页面不显示状态栏。PNG 无限等待期间不会独立重绘状态栏。
- 不需要字体包或新图片。旧 PNG 低电量底部告警保留;旧充电 PNG 不再自动
@@ -42,3 +42,23 @@ AddressSanitizer / UndefinedBehaviorSanitizer 检查 808 组有效性、充电
4. 动画结束同时到达新请求时不被自动 IDLE 覆盖。
编译 / 主机测试不等同于上述实机验证。
## 无 TE 的软件减撕裂试验
- GFX 使用单个 153,600 B PSRAM 合成缓冲(partition 模式,不是 RGB 全帧模式),
+ 普通眼睛更新先完成整个 dirty 区域,再进入 flush;不会在分块传输之间计算网格。
+- flush 使用单个 10,240 B 内部 DMA 暂存区;按最多 5,120 像素连续搬运,
+ 每批等待 ISR 完成后才复用,整区域发完才通知 GFX。PNG 原有 8 行块不变。
+- 相对上一版移除 2×2,560 B DMA 小缓冲,增加 5,120 B DMA 暂存净容量
+ (不含 SPI 驱动描述符);新增合成缓冲和 9,996 B 闭眼纹理共 163,596 B PSRAM。
+- closure >=232 时隐藏压缩眼圈并显示同色的抗锯齿闭眼弧线,避免极薄纹理抖动。
+- 34ms 帧预算包含绘制/传输时间,超时不会再固定额外等 34ms。
+- 每轮日志 emote blink composed draw_us_avg=... late_frames=.../12,
+ 仅反映绘制预算,不是面板实际扫描帧率。
+- DMA 超时会锁住 GFX 传输路径,不复用可能仍被硬件读取的缓冲;需重启恢复。
+- 此方案不能保证面板扫描无撕裂。实机比较眨眼上下断层、闭眼亮点及原有
+ 表情切换/状态栏行为;无 TE 时不能把软件预合成称为硬件同步双缓冲。
主机传输/闭眼回归:`python3 tools/test_lcd_emote_transport.py`,检查 320 种
区域宽度、DMA 分块/数据顺序、错误/超时处理及闭眼对称性。当前 RTOS tick
为 10ms,实际眨眼间隔仍有 tick 量化及任务调度抖动,日志不是实测 FPS。