Skip to content

显示管线

从资产到 AMOLED

text
PNG / bitmap atlas
  └─ convert_assets.py
       └─ game_assets.bin + index
            └─ AssetRenderer (RGB565)
                 └─ GameRenderer into PSRAM canvas A
                      └─ diff / dirty regions against canvas B
                           └─ LVGL / BSP flush
                                └─ CO5300 QSPI AMOLED

网页和固件共享源 PNG 与调色板,但固件不在运行时解码通用 PNG。转换器把二值 Alpha 与 RGB565 像素打包,并生成可校验索引;Pillow 11/12 都必须产出逐字节相同结果。

为什么使用两张全屏画布

双画布把“渲染下一帧”和“当前已提交画面”分离:

  • 可以比较变化像素或区域,而不读取 AMOLED。
  • display flush 与下一帧逻辑不必争用同一内容。
  • 全量参考画面可在主机测试中与局部渲染结果逐像素比较。
  • 页面切换或复杂状态可退回一次全帧,正确性优先。

代价是 868,624 bytes PSRAM;在 8 MiB 配置中可接受,但不能再随意增加第三张全屏缓存。

绘制层级

  1. 纯黑底色。
  2. 顶部导航与结构弧。
  3. underlay FX。
  4. 页面主体与 helper。
  5. 外缘手势 / STAR RUSH。
  6. 粒子。
  7. overlay FX。
  8. 浮字与提示。

脏区必须覆盖旧层与新层。尤其移动对象和稀疏 FX 需要“上一帧包围盒 ∪ 当前包围盒”,否则黑底上会留下彩色尾迹。

RGB565 一致性

浏览器是 RGB888,面板是 RGB565。验证不是直接要求三个通道字节相同,而是把两端颜色都映射回 CONSOLE-RGB16 逻辑色,再比较布局与语义像素。固定 initial/endgame、三页、now=0 后,v6 六张画面每页 114,546 个测试像素均为 100%。

局部刷新与周期校验

稳定帧只更新核心、helper、数值、meter、粒子和反馈等语义区域;状态指纹变化或页面切换触发全帧。v6 典型 dirty 约 40.6K pixels/frame,周期性全刷约 15/150 帧;v7 稳定 dirty 约 15K–18K,周期全帧约 10%。

显示前后

网页早期画面与固件 v7 渲染快照:DEVICE V7 SNAPSHOT网页早期画面与固件 v7 渲染快照:WEB V4WEB V4DEVICE V7 SNAPSHOT