# 20_架构设计 Codex 完成报告 v1 日期:2026-08-29 任务:`docs/40_任务/20_架构设计指令书_v1.md` 分支:`particle/main` 起始提交:`127de2271480000fcc8f390d81cf446e98757800` 结束提交:`127de2271480000fcc8f390d81cf446e98757800`(本任务未提交) 执行结论:PASS(文档设计任务) 下一阶段:B,进入 `30_最小技术验证` ## 1. 前置文档与 Git 基线 | 项目 | 状态 | 结果 | |---|---|---| | 根 AGENTS/基线 | 已完成 | 已读取 `AGENTS.md`、`PARTICLE_BASELINE.md` | | 项目总则 | 已完成 | 已完整读取 `docs/00_项目总则/` 全部当前有效文件 | | 项目规范 | 已完成 | 已完整读取 `docs/00_项目规范/` 全部当前有效文件 | | 前置调查/报告 | 已完成 | 已读取调查报告和 Codex 完成报告 | | 当前架构/记录/Step | 已完成 | 已读取现有架构文档、开发记录和 STEP-000 | | 当前设计任务书 | 已完成 | 1092 行已完整读取 | | Git baseline | 已完成 | `particle/main`,HEAD 为上述起始提交;submodule 已查询 | | 工作区干净 | 未完成 | 开始时已有上一阶段文档变更及用户提供的两份未跟踪任务书;均予以保留 | ## 2. 设计必做项状态 | 必做项 | 状态 | 结果 | |---|---|---| | 候选渲染路线比较 | 已完成 | 比较 CustomLayer、CustomDrawable、独立 Core layer、Overlay | | 唯一主路线选择 | 已完成 | 独立 Core RasterParticleLayer/RenderRasterParticleLayer + gfx | | Core 模块设计 | 已完成 | Field、Adapter、Simulation、Render、GPU、Mask、Controller | | 与 Style/RenderTree/gfx 关系 | 已完成 | 正式进入 Style/RenderTree,offscreen pass + translucent composite | | WeatherColor/Particle 边界 | 已完成 | 分离 Layer/RenderLayer/GPU 状态/动画生命周期 | | Data/Field contract | 已完成 | RasterArraySource、immutable snapshot、revision、canonical U/V | | Fixture contract | 已完成 | metadata.json、field.f32、mask.u8、字节序、校验和、五个预留场景 | | GPU resource 设计 | 已完成 | velocity、State A/B、Trail A/B、Mask、uniform、shader set | | GPU state/simulation | 已完成 | 逻辑状态、render-pass ping-pong、NoData/mask/respawn;compute 延后 | | Trail 架构 | 已完成 | 第一阶段包含 screen-space ping-pong trail,Camera 变化清空 | | Land/Ocean Mask | 已完成 | 独立 snapshot/cache/texture,OCEAN_ONLY 共享,缺失 fail closed | | 数据流与频率分类 | 已完成 | 低频、每帧、Camera 变化三类已定义 | | 线程模型 | 已完成 | Map/UI、Worker、Render、GPU 的所有权和交接已定义 | | Camera/Matrix 同步 | 已完成 | 只读取当前 render frame Paint/Transform parameters | | 帧驱动 | 已完成 | MapLibre render loop + needsRepaint,禁用独立粒子时钟 | | Android 薄接入 | 已完成 | typed JNI;禁止 raw long;OpenGL 主线、Vulkan gate | | iOS 薄接入 | 已完成 | Core Source/Layer peer;CustomStyleLayer 只作参考;后续 Metal/OpenGL gate | | 生命周期状态机 | 已完成 | DISABLED 至 ERROR/CONTEXT_LOST 的状态、恢复和释放责任已定义 | | 公共 API/配置分层 | 已完成 | backend-independent source/layer/options/status;内部参数不外露 | | 错误/降级 | 已完成 | Field、Mask、GPU、backend、context、shader、memory pressure 均定义 | | 性能预算 | 已完成 | 给出待验证目标和测量档位,未声称性能已达到 | | 最小技术验证清单 | 已完成 | 压缩为四项,并标记阻塞性和最小方法 | | 不采用方案 | 已完成 | 逐项拒绝任务书要求的八类方案及 CPU/compute-only 等 | | 九类架构图 | 已完成 | 总体、Core、fixture 数据流、每帧、Camera、Android、iOS、Mask、状态机 | | 架构冻结项 | 已完成 | 14 项正式冻结;同时列出不得冻结项 | | 下一阶段判断 | 已完成 | B:进入 `30_最小技术验证` | ## 3. 核心架构选择 正式主路线是新增独立 Core `RasterParticleLayer`、`RenderRasterParticleLayer` 和 `mbgl::particle` 模块,通过 `RasterArraySource` 接受 immutable Field snapshot,进入 MapLibre Style/RenderTree,并使用 gfx Texture/RenderTarget/Drawable/Shader/UploadPass 完成 GPU simulation、trail 与 translucent composite。 CustomLayer/CustomDrawable 不构成产品双轨;Android raw `CustomLayerHost` 不进入正式 API。平台只提供类型安全 Source/Layer peer、backend lifecycle 与 capability 薄接入。 ## 4. 实际生成或修改文件 - 新增 `docs/10_架构/20_粒子系统总体架构设计_v1.md`。 - 新增 `docs/报告/20_架构设计_Codex完成报告_v1.md`。 - 追加 `粒子开发记录.md`。 - 未修改现有 `docs/10_架构/MapLibre粒子总体架构_v1.md`;其简略 Layer 顺序与本设计一致。 - 未新增或修改 `docs/50_Step记录/`;符合任务书第 31 节。 ## 5. 无法验证与未完成 ### 无法验证 - 独立 particle RenderLayer 在 Android OpenGL/Vulkan 的运行时 pass/barrier/context 行为。 - State/Trail RenderTarget 的实际格式、性能和 context recreation 时间。 - Camera/wrap/Mask 在真机/模拟器上的视觉正确性。 - iOS Metal/OpenGL 的粒子 Core layer 薄接入。 - 最终 FPS、最大粒子数、最佳 texture format、设备能力和生产 Mask 来源。 这些均已列入 `30_最小技术验证` 或明确标记为后续 Gate,不影响本次总体设计文档 PASS。 ### 未完成 - 无。本任务要求的设计输出均已完成;生产实现、构建和运行时验证本来就是本任务禁止项。 ## 6. 代码、依赖、构建与测试 - 生产/实验源码:未修改。 - Android/iOS/Gradle/Pod/CMake/package/lock:未修改。 - 依赖:未安装、未升级。 - 构建:未执行;任务明确禁止会修改工程状态的构建。 - 测试:未执行;本阶段仅做静态架构设计。 - APK/AAR/其他产物:无。 - 项目总则/项目规范:未修改。 ## 7. 与指令书差异、阻塞和建议 - 与指令书差异:无。 - 与长期总则冲突:无。 - 阻塞:没有阻塞本次设计完成的事项;存在四项会阻塞后续正式实现或平台扩展的运行时验证。 - 建议:下一份正式指令书进入 `30_最小技术验证`,只覆盖设计文档第 26 节四项验证,不创建完整粒子产品实现,也不重新讨论总体架构。