Files
MapLibreParticleLab/docs/50_Step记录/STEP-040_Android离线Fixture正式粒子最小闭环_v1.md
OpenAI Codex 8eaed68c45
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
docs: close 40-01 android validation
2026-09-02 09:06:39 +08:00

40 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# STEP-040 Android 离线 Fixture 正式粒子最小闭环 v1
## 状态
完成。40-01 Stage B Android OpenGL x86_64 手工验收已完成,正式状态为 `PASS`。
## 目标与基线
- 目标:建立 `RasterArraySource -> RenderRasterArraySource -> RasterParticleLayer -> RenderRasterParticleLayer` 的第一条正式离线粒子闭环,并修复 STATIC recreation 的零步 bootstrap。
- 基线:`343cecc778c3ffaa00adf94f82d7ad5f494a3877`,分支 `particle/main`。
- 前置:30-01、30-02、30-03 均为 PASS;EGL context recreation 的独立实机证据仍是已接受风险。
## 必做项
- [x] `RasterArraySource` 以 FileSource byte boundary 读取 fixture metadata 与 field,生成 immutable `ParticleFieldSnapshot`。
- [x] `RenderRasterArraySource`、`RasterParticleLayer`(`Source::Required`)和 `RenderRasterParticleLayer` 进入 Style/RenderTree 链。
- [x] 正式 RenderLayer 复用既有 GPU field、State A/B、Trail A/B、mask、camera/world-wrap/antimeridian 与 resource lifecycle;没有第二套 simulation。
- [x] Android Test App 从 APK `asset://integration/particle-fixtures/...` 提供正式 source 输入;Linux smoke helper 仍可读取仓库 fixture。
- [x] NoData cell 作为 GPU field texture alpha=0 上传;shader 遇到 invalid sample 确定性回到 seed position,不把 NoData 当速度。
- [x] STATIC recreation 仍走 zero-step State/Trail/bootstrap composite,commit 不增加 `simulationFrame`。
- [x] Android OpenGL x86_64 APK 手工验收:GLOBAL/ACTIVE/STATIC、fixture 切换、Rotation、Camera、world wrap、antimeridian、mask、disable/enable 与快速切换均 PASS。
## 允许修改
隔离 particle field/source/layer/render source/render layer、最小 LayerManager/Style Source/shader 注册、Android Test App fixture assets 与本 Step 文档。
## 禁止修改
不得运行 Gradle、安装 APK、ADB/T1-T12;不得新增 Overlay、Android UI/Core 耦合、在线数据、第二套 GPU simulation,或声称 Android/Vulkan/iOS PASS。
## 构建与检查
- Linux OpenGL 受影响 Core 与 `source.test.cpp.o` 均在各轮修复后精确编译:PASS(`-Werror`);完整 `mbgl-test` 不属于本任务的精确验证范围。
- `clang-format --dry-run --Werror`、`git diff --check`、shader generator/source-header parity 与生成器幂等检查:PASS。
- adapter smoke:`uniform-east`、`uniform-north`、`vortex` 均 valid;`nodata` valid 且有 1 个 invalid cell。Android APK OpenGL x86_64 手工验收:PASS。
## 当前结果、阻塞与下一步
正式 `RasterArraySource -> RasterParticleLayer` 闭环已通过 Android OpenGL x86_64 Stage B。历史调试中先后修复 OfflineDownload 枚举接入、enabled RasterArray source 空 RenderItem SIGSEGV、旧 APK/.cxx native 缓存、ACTIVE/STATIC transient reset、formal Composite 未显示 Trail、shader source/generated header 不一致、opaque RenderTarget clear 下的 State seed、source 重建的 field identity generation collision,以及 STATIC Rotation/Viewport 自动恢复。最终实机已确认:east/north/east 切换方向正确、ACTIVE/STATIC lifecycle 正确、Camera 与 Rotation 正确、GLOBAL/OCEAN A/OCEAN B 与 shared mask reuse 正确。相同 RenderThread/resource generation 内三种 mask consumer 均复用同一 `maskGeneration` 且 `reuse=true`;graphics resource 重建后的 generation 递增属于新 GPU resource,不是同 generation 内重复创建。40-01 正式关闭为 `PASS`。iOS、Vulkan、真实在线数据、生产 coastline/mask 和性能结论不在本 Step 范围。