This commit is contained in:
HP
2026-06-07 14:37:58 +08:00
13 changed files with 445 additions and 43 deletions
+29
View File
@@ -87,11 +87,31 @@
## 5. 渲染管线性能规范
- FrameBuffer / DepthBuffer 清理必须优先考虑批量填充(如 `memset`、`std::fill`、平台优化路径),不要逐像素走复杂逻辑。
- 2D-only 或不使用深度测试的场景应只清颜色缓冲,例如使用 `DrawContext::clear_color()`;不要每帧无意义清理 depth buffer。
- 像素写入路径应尽量减少分支和函数调用层级。
- 像素级写入的 Release 快路径不要使用带额外边界检查的容器访问(例如 `std::vector::at()`);边界检查应在外层完成。
- 裁剪、剔除、包围盒收缩要尽早执行,避免把不可见数据送入像素级循环。
- 三角形属性插值、深度测试、纹理采样等未来功能必须先定义定点/整数方案,再接入热路径。
- PC 调试版可以保留更易读的检查与可视化代码,但 ARM release 路径必须能关闭这些额外成本。
### 5.1 `/dev/fb0` 提交路径
Framebuffer 后端是 IMX6U 上最容易误判性能的路径。`FBDisplay::present()` 需要把 CPU 侧 framebuffer 写入 `/dev/fb0`,如果逐像素走通用格式转换,整屏 1024x600 提交会成为主瓶颈。
规范:
- ARM / framebuffer 性能测试必须使用 Release 构建;单配置生成器应确认 `CMAKE_BUILD_TYPE=Release`。
- 性能结论必须拆分 `Frame` 和 `Present` 耗时;如果 `Present` 接近 `Frame`,优先优化显示提交,而不是游戏逻辑。
- fb0 像素格式应在初始化时打印并据此走专用路径,常见格式包括 RGB565、ARGB8888/XRGB8888、RGBA8888。
- 避免每帧重复做不必要的通用 RGBA 转换;可考虑目标格式 backbuffer、预转换资源、行拷贝、dirty rect 和局部提交。
- 直接写 `/dev/fb0` 不是原子换屏;LCD 控制器可能边扫描边显示正在写入的内存,因此肉眼流畅度不等同于完整帧率。
已观察到的板端测试结论:
- 未优化 ARM 构建下,轻量 2D demo 曾出现约 `Frame:81ms / Present:69ms`。
- 改为 Release 构建后,同一类 framebuffer 测试最高约 76 FPS。
- 因此板端性能测试首先检查构建类型,再判断算法或硬件瓶颈。
## 6. STL 与标准库使用边界
允许:
@@ -129,6 +149,7 @@
新增或修改核心代码前,至少检查:
- [ ] ARM / framebuffer 性能测试是否确认使用 Release 构建?
- [ ] 是否在热路径新增了 `float` / `double`?如果是,是否能改成整数/定点?
- [ ] 是否在每帧或内层循环创建了 `std::vector` / `std::string` / 其他堆分配对象?
- [ ] 容器是否提前 `reserve()`,或由上层复用?
@@ -214,3 +235,11 @@
- 总帧时间、最低 FPS、峰值帧时间
性能日志默认低频输出,例如每 60 帧汇总一次;ARM release 中不得逐帧大量打印。
Framebuffer 对照后端同样需要至少显示或记录:
- `Frame`:从帧开始到提交完成的总耗时;
- `Present`:`IDisplay::present()` 的耗时;
- 当前 FPS。
当前 Demo 的板端测试 UI 已包含这些信息,后续正式 profiler 可替代该临时显示。