Files
MapLibreParticleLab/docs/50_Step记录/STEP-045_Runtime_Field动态更新接口_v2.md
OpenAI Codex eae8652486
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
docs: close runtime particle field validation
2026-09-03 19:23:38 +08:00

3.5 KiB
Raw Permalink Blame History

STEP-045 Runtime Field 动态更新接口

  • 状态:CLOSED / PASS
  • 最终 Android 验证日期:2026-09-03
  • 当前最终功能基线:4e31163516ad77473df672e162f554223cd2f09e

目标与冻结接口

40-04 使正式 RasterParticleLayer 数据链在运行中接收新的内存 Field 时间片,不依赖 Style reload、Source/Layer recreate 或 simulation restart。

  • 正式更新接口:RasterArraySource::updateRuntimeFieldWindow(ParticleFieldSnapshot)。
  • Duplicate 验证接口:RasterArraySource::repeatRuntimeFieldWindow();它重新提交 Source 当前 T1,并经正式 update API 返回 Noop。
  • RasterArraySource::Impl::field/nextField 是正式 T0/T1 的唯一权威状态;JNI 只是薄桥,Android Validation 只触发测试动作,Kotlin 不持有正式 T0/T1。
  • Renderer 负责 GPU Field resource reuse/upload;RasterParticleLayer 继续负责既有 simulation、Trail 与 Composite。

Android OpenGL 最终验收:PASS

验收项 结果 最终证据
T-RUNTIME-01 PASS 初始 T0=uniform-east、T1=uniform-north;MIX 0/50/100 正常,TIME_MIX_UPDATE 期间 Field upload/reset 不增加。
T-RUNTIME-02 PASS A/B→B/C(east/north→north/vortex):FIELD_REUSE from=OLD_T1 to=NEW_T0,仅上传 vortex,simulationRebuild=false、trailCleared=false。
T-RUNTIME-03 PASS B/C→C/D(north/vortex→vortex/nodata):再次复用 OLD_T1,仅上传 nodata,证明连续推进未写死一次。
T-RUNTIME-04 PASS C/D 下 MIX 50/100/0:fieldUploadCount=5、resetCount=0 始终不变,MIX 保持 property-only。
T-RUNTIME-05 PASS C/D 下连续 DUPLICATE T1:每次 FIELD_WINDOW_UPDATE_APPLIED result=NOOP 与 duplicate bridge result=NOOP;无 upload/reset/style load,T0/T1 不变。
T-RUNTIME-06 PASS candidate 耗尽返回 FIELD_WINDOW_UPDATE_REJECTED reason=NO_PRELOADED_FIELD;随后 MIX 仍显示 C/D,fieldUploadCount=5、resetCount=0,fail-closed 成立。

最终运行时契约

Runtime / Validation Host
  -> RasterArraySource::updateRuntimeFieldWindow(...)
  -> Source-owned T0/T1
  -> A/B -> B/C -> C/D
  -> OLD_T1 -> NEW_T0 GPU reuse
  -> upload only new T1
  -> ongoing RasterParticleLayer simulation / Trail / Composite
  • 正常推进不重载 Style、不重建 Layer/Source、不 reset simulation、不 clear Trail;日志确认 simulationRebuild=false、trailCleared=false。
  • 初始 STYLE_LOAD reason=TIME_WINDOW 是用户建立 A/B Validation window 的允许初始化行为。之后 A/B→B/C、B/C→C/D、Duplicate 和 candidate 耗尽 reject 全程 styleEpoch=2 不变。
  • MIX property 更新产生的 LAYER_CHANGED 是正常 RenderLayer change 通知,不是 Layer recreate;最终 renderLayerInstanceId=1 保持稳定。

未改变的冻结能力与范围外内容

40-04 未改变 U=east-positive、V=north-positive、Mercator shader 边界 dy=-v、T0/T1 GPU interpolation、MIX property-only,或 40-03 的 full particle draw(N State texels→N simulated particles→N actual particle draw)与已验证 capacity ≥ 1,048,576。

本 Step 未实现真实天气 HTTP、GRIB、Server、forecast cache、vendor/provider 协议、NavSea/React Native 正式接入、粒子形状/旋转/箭头、颜色系统、WeatherColorLayer、Vulkan、iOS/Metal、生产 Land/Ocean Mask 或 APK packaging/ZIP 技术债。

收尾边界

本收尾只更新文档和开发记录;未修改功能代码,未运行新的 Linux/OpenGL 编译、Android Gradle、ADB、实机测试或 Jest。