16 KiB
16 KiB
粒子开发记录
2026-08-27 — STEP-000
- 建立正式 Ubuntu MapLibreParticleLab 工作目录。
- MapLibre core:18545ca10d296704b2cba675b182ff2c8da24588
2026-08-28 — STEP-000 环境基线冻结
- Ubuntu 24.04 x86_64 MapLibreParticleLab 主开发环境建立完成。
- Linux OpenGL Native 构建通过。
mbgl-render构建通过。mbgl-render-test-runner构建通过。- Android OpenGL Debug
apackage构建通过。 - Android Vulkan Debug
apackage构建通过。 - OpenGL/Vulkan AAR 均包含 arm64-v8a、armeabi-v7a、x86、x86_64 的
libmaplibre.so。 - Vulkan Debug AAR 同时包含 Khronos Validation Layer。
- Android SDK 路径已通过
ANDROID_HOME与local.properties固化。 - 下一步进入 STEP-001:MapLibre Native 粒子接入点只读调查。
2026-08-29 — 10_架构调查
- 按
docs/40_任务/10_架构调查指令书_v1.md完成只读架构调查。 - 确认当前仓库是 MapLibre Native monorepo,不是 React Native 应用;确认 Android 13.4.1、iOS 6.28.0 和共用 Core 渲染链。
- 确认 Android OpenGL/Vulkan、iOS OpenGL/Metal、Core CustomLayer/gfx、Camera/Matrix、帧驱动和线程边界;粒子 fixture 目前只有空目录占位,暂无粒子运行时代码。
- 生成
docs/20_调查/10_架构调查报告_v1.md和docs/报告/10_架构调查_Codex完成报告_v1.md。 - 本次未修改生产代码、原生工程、依赖或项目总则;遵循用户要求未自行创建或修改 Step 文件。
2026-08-29 — 20_架构设计
- 按
docs/40_任务/20_架构设计指令书_v1.md完成第一版正式粒子系统总体架构设计。 - 生成
docs/10_架构/20_粒子系统总体架构设计_v1.md和docs/报告/20_架构设计_Codex完成报告_v1.md。 - 正式主路线冻结为独立 Core
RasterParticleLayer/RenderRasterParticleLayer+RasterArraySource+ 隔离mbgl::particle模块,进入 Style/RenderTree 并使用 MapLibre gfx;CustomLayer/CustomDrawable 不作为产品主宿主。 - 冻结 WeatherColor/Particle 分层、Field/fixture contract、Wind GLOBAL、海洋场 OCEAN_ONLY 共用 Mask、MapLibre frame driver、同帧 Camera Matrix、GPU resource/context-loss 和平台薄接入原则。
- 下一阶段选择
30_最小技术验证,集中验证独立 RenderLayer、OpenGL/Vulkan ping-pong/trail/context、Camera/wrap/Mask 和 iOS 薄接入。 - 最终 FPS、最大粒子数、最佳 texture format、生产 Mask 来源、真实天气协议和生产 Host API 仍未确认。
- 本次未修改生产代码、依赖、构建配置、项目总则或 Step,未运行构建/测试。
2026-08-29 — 30-01 Core RenderLayer 接入验证(阶段 A)
- 按
docs/40_任务/30_01_CoreRenderLayer接入验证指令书_v1.md完成最小验证代码准备。 - 新增 source-less
ParticleValidationLayer/RenderParticleValidationLayer,经正式 Style/LayerManager/RenderTree/LayerGroup/translucent pass 链接入;代码明确标记VALIDATION ONLY。 - 新增默认 false 的 RenderLayer repaint hook;ACTIVE 通过 MapLibre 自身
needsRepaint → Map::onUpdate → Android requestRender链持续帧,STATIC 停止验证层额外请求。 - 验证 Drawable 在真实 pass 内读取当前
PaintParameters/TransformParameters/TransformState的 viewport、zoom、bearing、pitch 和 projection matrix 摘要。 - Android Test App 新增
Particle Core Layer Validation页面,提供 ACTIVE/STATIC 切换和蓝/黄普通 Style Layer 顺序参照。 - Linux OpenGL 重新配置通过;本任务新增/直接修改的 5 个 Core 对象精确编译通过。全量增量因公共头触发 321 个对象重编译,在 41/321 无错误时主动停止,未宣称全量 PASS。
- 遵循指令书未运行 Android/Gradle/npm/ADB;等待用户手工 Android OpenGL 编译、运行、手势、resize 与日志证据。
- 当前结论为
WAITING_MANUAL_VALIDATION;不得进入下一项 GPU ping-pong/Trail 验证。
2026-08-29 — 30-01 Core RenderLayer 接入验证(阶段 B 修复轮次 1)
- 用户 Android OpenGL 实机日志暴露
RenderParticleValidationLayer::update()的 DrawableBuilder 生命周期错误:当前 Drawable 未完成就调用clearDrawables(),RenderThread 随后触发 SIGSEGV。 - 对照
DrawableBuilder::flush(context)与仓库既有 Drawable 使用方式,在clearDrawables()前补充builder->flush(context),使 custom validation Drawable 完成后再转移给 LayerGroup。 - 未以空指针判断跳过 Drawable;Tweaker 仍必须进入真实 translucent render pass 并读取同帧 Transform。
- Linux OpenGL 对应目标对象编译通过;C++ 格式和
git diff --check通过。 - 未运行 Android/Gradle/npm/ADB,等待用户在新提交上重新手工编译和实机运行。
- 当前结论仍为
WAITING_MANUAL_VALIDATION;未扩大到粒子、GPU ping-pong、Trail、Mask、Vulkan 或 iOS。
2026-08-29 — 30-01 Android Test App APK 版本标识
- 在 Test App 主菜单列表顶部增加当前 APK 构建身份显示。
- 显示
versionName/versionCode、renderer flavor、build type 和构建时 Git revision 前 10 位,均来自 BuildConfig,不写死版本。 - 版本条用于人工验证时区分旧 APK 与当前源码构建,避免只凭安装时间或文件名判断。
git diff --check与 Android XML 标准库解析通过;按用户要求未执行任何编译。- 等待用户手工构建、安装后确认设备端显示。
2026-08-29 — 30-02 GPU Ping-Pong 与 Context Recreation(前置阻塞)
- 开始执行
docs/40_任务/30_02_GPU_PingPong与ContextRecreation验证指令书_v1.md并首先检查硬前置门槛。 - 30-01 最新技术报告与完成报告均仍为
WAITING_MANUAL_VALIDATION,不存在正式 PASS 记录或 PASS commit。 - 按 30-02 指令书第 2 节停止:未创建 State A/B、Trail A/B、RenderTarget、Shader、ping-pong、generation 或 context recreation 验证代码。
- State A/B、Trail A/B、gfx 同步、resize、disable/enable 和 context recreation 均未验证,无 PASS/FAIL 技术结论。
- 当前 30-02 状态为
BLOCKED;不允许进入 30-03。 - 阻塞报告:
docs/60_测试/30_02_GPU_PingPong与ContextRecreation最小技术验证报告_v1.md。 - Codex 完成报告:
docs/报告/30_02_GPU_PingPong与ContextRecreation验证_Codex完成报告_v1.md。
2026-08-29 — 30-01 Core RenderLayer 接入验证(用户验收 PASS 回填)
- 用户已完成 Android OpenGL 构建和
Particle Core Layer Validation实际运行验收,明确确认结果为 OK/PASS。 - 30-01 正式状态由
WAITING_MANUAL_VALIDATION更新为PASS;Core RenderLayer 接入、ACTIVE/STATIC repaint、同帧 Transform 及 pan/zoom/bearing/pitch/resize 验证范围均由用户确认满足要求。 - 本次只回填验收状态:未重新修改 30-01 代码、未重新编译、未重新运行 Android、未执行 ADB。
- 30-01 正式完成,允许重新开始 30-02。
- 30-02 v1 的
BLOCKED历史记录继续保留;它反映当时 30-01 正式 PASS 尚未回填,不代表 GPU/gfx 架构验证失败。
2026-08-29 — 30-02 GPU Ping-Pong 与 Context Recreation(阶段 A)
- 30-01 正式状态为
PASS,此前 30-02 v1 的历史BLOCKED前置原因已解除;开始重新执行 30-02 指令书。 - validation-only State A/B 已使用两套固定尺寸独立 GPU RenderTarget 实现;每帧 read/write 反向选择,无 CPU 完整状态复制。
- Trail A/B 已使用两套 viewport 尺寸真实 RenderTarget 实现 previous fade/marker → next,并把 next 合成到 MapLibre 主 translucent pass。
- 静态确认只注册当帧 write target,read target 不作为当帧附件;RenderTarget 顺序为 State → Trail,主 pass 后续 composite,slot 在 composite Tweaker 到达时提交。
- resize 只重建 Trail A/B 并保留 State A/B;disable/remove 会停止并释放或重置资源;context lost 记录旧 generation discard,新资源使用递增 generation。
- 复用
Particle Core Layer Validation,保留 ACTIVE/STATIC 并增加 DISABLE/ENABLE;没有修改通用 gfx API、正式粒子、Mask、Vulkan 或 iOS。 - 静态格式、JSON、shader 注册链与 diff 检查通过;遵守用户要求未编译,未运行 Gradle/Android/ADB。
- 当前状态为
WAITING_MANUAL_VALIDATION:State/Trail 实际 GPU 交替、OpenGL 同步、resize、disable/enable 和真实 context recreation 均等待用户手工运行证据。 - 不允许进入 30-03;若无法确认真实 context recreation,最终应按指令书标记
BLOCKED。 - 技术报告:
docs/60_测试/30_02_GPU_PingPong与ContextRecreation最小技术验证报告_v2.md。 - Codex 完成报告:
docs/报告/30_02_GPU_PingPong与ContextRecreation验证_Codex完成报告_v2.md。
2026-08-30 — 30-02 T3 STATIC freeze 实机缺陷修复
- 用户 Android OpenGL 手工验证确认:STATIC 静止时 State/Trail 停止,但 STATIC 拖动地图触发 MapLibre redraw 时仍继续推进,停止拖动后再停止;原 T3 正式判定为 FAIL。
- 原因是
needsRepaint=false只停止 validation 主动请求帧,而原update()在地图手势帧中仍无条件注册 State/Trail RenderTarget、设置 pending,并由 composite Tweaker提交 slot/frame。 - 最小修复在
RenderParticleValidationLayer增加 STATIC frozen-composite 路径:地图主 pass 仍正常 redraw 并显示最后 commit 的 Trail,但不注册离屏 target、不执行 State/Trail update、不 fade/加 marker、不 swap、不增加 simulation frame/index。 - STATIC 下不因 resize 重建/清空 Trail;恢复 ACTIVE 后才继续原 ping-pong 与 resize 生命周期。
- 仅修改 validation RenderLayer
.cpp/.hpp和本轮文档;未修改 Test App、shader、通用 gfx、正式粒子、Mask、Vulkan 或 iOS。 - C++ 格式、diff 与 GPU scheduling/commit 静态控制流检查通过;按用户要求未编译,未运行 Android/Gradle/ADB。
- 修复后的 T3 等待用户在 commit
364b8f381e27eee36c4895084b2f0578a023fa61上重新手工验证;30-02 总体状态仍为WAITING_MANUAL_VALIDATION,不允许进入 30-03。 - 技术报告:
docs/60_测试/30_02_GPU_PingPong与ContextRecreation最小技术验证报告_v3.md。 - Codex 完成报告:
docs/报告/30_02_GPU_PingPong与ContextRecreation验证_Codex完成报告_v3.md。
2026-08-30 — 30-02 Android Rotation 状态恢复定向修复
- 用户确认此前 STATIC 的 pan/zoom/bearing/pitch 手势回归已经通过,DISABLE / ENABLE 正常;但旋转导致 Activity recreation 后 STATIC 错误恢复为 ACTIVE。
- 根因是 Test App 没有将
active/enabled写入 Bundle,且onCreate()无条件恢复 ACTIVE + ENABLED 并重置 camera。 - 仅在
ParticleCoreLayerValidationActivity.kt新增 Bundle key、保存/恢复 validation control mode;recreation 复用恢复后的统一loadValidationStyle(),且只在首次进入设置默认 camera。 - 未修改 Manifest、C++、gfx、RenderLayer、shader、GPU ping-pong、GPU 状态、Gradle 或依赖;未使用 configChanges、方向锁定、SharedPreferences、全局变量或 GPU 序列化。
git diff --check与状态控制静态检查通过;按要求未运行 Gradle、Android 编译或 ADB。- R1 STATIC、R2 ACTIVE、R3 DISABLED rotation 与 R4 STATIC gesture 回归等待用户实机验证;30-02 保持
WAITING_MANUAL_VALIDATION,不允许进入 30-03。 - 技术报告:
docs/60_测试/30_02_GPU_PingPong与ContextRecreation最小技术验证报告_v4.md。 - Codex 完成报告:
docs/报告/30_02_GPU_PingPong与ContextRecreation验证_Codex完成报告_v4.md。
2026-08-30 — 30-02 正式关闭(EGL Context Recreation Accepted Risk)
- 用户已完成并确认 30-02 的 Android OpenGL 实机结果;ACTIVE/STATIC、GPU ping-pong、STATIC 手势冻结、DISABLE/ENABLE 与 rotation control-mode 恢复纳入正式结论。
- 30-02 正式状态为
PASS,并正式关闭;允许进入 30-03。 - 真实 EGL Context recreation 没有独立实机验证证据,明确标记为
Accepted Risk / 未验证项;用户已明确决定该风险不阻塞后续阶段。 - 未伪造 context-loss PASS,也未重写 v1
BLOCKED、v2、v3 或 v4 历史报告。 - 本次只回填报告与开发记录;未修改代码,未重新编译,未运行 Gradle、Android 或 ADB。
- 技术报告:
docs/60_测试/30_02_GPU_PingPong与ContextRecreation最小技术验证报告_v5.md。 - Codex 完成报告:
docs/报告/30_02_GPU_PingPong与ContextRecreation验证_Codex完成报告_v5.md。
2026-08-30 — 30-03 Camera / World Wrap 与 Land/Ocean Mask(阶段 A)
- 30-02 已正式 PASS,EGL Context recreation 作为用户接受的未验证风险不阻塞,故开始 30-03。
- validation composite 改为使用当前
PaintParameters::matrixForTile()的 canonical z0 world quad;ACTIVE/STATIC 继续区分 simulation update 与 Camera redraw。 - 通过
UnwrappedTileID.wrap绘制中心和相邻 MapLibre world copy;仅中心 copy commit,避免 world copy 额外推进 30-02 GPU simulation。 - 增加反经线两侧 deterministic anchors C/D,并以全球 canonical mask UV 复用 MapLibre wrap,不建立第二套 world 状态机。
- 增加 validation-only shared 16×16 synthetic coastal mask,GLOBAL、OCEAN_ONLY_A/B 复用同一 GPU texture;Camera/consumer 切换不重建,context-destroy 通知后按新 generation 重建。
- Android Test App 复用既有入口,增加 GLOBAL/OCEAN A/OCEAN B/DATELINE/WORLD WRAP 最小控制;未运行 Android 编译、Gradle 或 ADB。
- Linux OpenGL 受影响 Core 对象精确编译、C++ 格式与 diff 检查通过;用户 T1–T13 实机验证仍待执行。
- 当前状态:
WAITING_MANUAL_VALIDATION;不允许进入 iOS 最小验证。 - 技术报告:
docs/60_测试/30_03_Camera_WorldWrap与LandOceanMask最小技术验证报告_v1.md。 - Codex 完成报告:
docs/报告/30_03_Camera_WorldWrap与LandOceanMask验证_Codex完成报告_v1.md。
2026-08-31 — 30-03 Camera / World Wrap 与 Land/Ocean Mask(最终 PASS)
- 用户已完成 Android OpenGL 手工验收,T1–T13 全部记录为
PASS;30-03 正式状态更新为PASS。 - 已确认本最小验证范围内的 Camera 同帧地理锁定、ACTIVE/STATIC camera redraw 分离、world wrap、双向反经线连续性,以及 shared Land/Ocean Mask 的 GLOBAL / OCEAN_ONLY_A / OCEAN_ONLY_B 语义。
Rotation/Viewport 自动恢复问题为已知问题;用户接受延期,明确在下一个任务修复。本轮不声称该问题已修复,也不将其伪造为已验证功能。- 真实 EGL context recreation 的独立设备证据、正式 fixture adapter、正式 NoData fail-closed 和生产 coastline 数据仍未完成;EGL 风险沿用 30-02 的
Accepted Risk / 未验证边界。 - 30-03 已允许进入下一阶段;下一任务优先处理 Rotation/Viewport 自动恢复延期项。
2026-08-31 — 40-01 Android 离线 Fixture 到正式粒子渲染最小闭环(Stage A)
- 30-03 后进入 Android 第一条离线 fixture 粒子闭环;Rotation/Viewport 自动恢复技术债已纳入本任务。
- 新增 backend-neutral
OfflineFixtureParticleAdapter和ParticleFieldSnapshot,以 v1 metadata、binary length 与 SHA-256 把 uniform-east、uniform-north、vortex 解码为正式 Field;不使用在线数据或 Android UI 依赖。 - GPU field texture 接入既有 State A/B;Trail A/B 改为读取 State write texture,fixture 切换递增 field/gpu field generation 并清理旧 trail;Mask 继续走既有 shared GLOBAL/OCEAN_ONLY 路线。
- STATIC 不再阻止 resource bootstrap:Activity/context recreation 后会建立 field/mask/trail/state 并做零步 first composite,
simulationFrame不增加;Activity 保存 active/enabled/mask/fixture 选择。 - Linux OpenGL 受影响 Core 对象、C++ format、diff、fixture checksum 和 adapter smoke test 均通过;未运行 Gradle/ADB/实机验证。
- 当前结论:
WAITING_MANUAL_VALIDATION。用户仍需完成 Android OpenGL T1-T12,尤其 T1 rotation 无按钮恢复;iOS、Vulkan、真实数据、生产 mask 和性能均未覆盖,尚不建议进入下一 Android 子任务。