# STEP-041 Android 双时间片 GPU 时间插值 - 状态:`CLOSED / PASS` - 前置:STEP-040(40-01)已在 Android OpenGL 手工验收为 PASS。 - 目标:在唯一正式链路 `RasterArraySource -> RasterParticleLayer -> GPU Simulation -> Trail -> Composite` 中,把单 Field 扩展为 T0/T1 两个独立 GPU Field,并在 State pass 对速度作 GPU `mix`。 - 实现提交:`4675a8a29dd6fc7b684bfb64913a8c9075ad8583`(`feat: add GPU particle time interpolation`)。 - 40-02C 最终修正:原实现的 MIX fallback、GPU identity 与 NORTH Mercator displacement 问题由 STEP-043/043A/043B 修正;Android T1--T10 已完成并全部 PASS。 ## 本轮实现 - `RasterArraySource` 支持可选 `next-fixture`、`next-metadata`、`next-field`,以同一 FileSource byte boundary 加载 T0/T1;两份快照必须具有相同 grid、bounds、NoData、Field 类型及 display domain。 - `RasterParticleLayer` 新增常量 paint property `raster-particle-time-mix`(有限值,内部 clamp 至 `[0,1]`)。它仅更新既有 UBO,不能触发 Field upload 或 State/Trail 重建。 - `RenderRasterParticleLayer` 维持一套既有 State A/B、Trail A/B、Mask 与 Composite,只将 Field GPU resource 扩为 T0/T1 两个 texture slot。窗口推进时会按 generation + fixtureID + dataVersion 匹配旧 slot;A/B -> B/C 复用 B、只上传 C,并不 reset simulation/trail。完全无重叠的新窗口仍走既有安全 reset/reseed。 - State shader 分别 decode T0/T1 RG velocity 后使用 `mix(velocity0, velocity1, timeMix)`;没有 CPU 生成中间完整 Field。NoData alpha 在任一端无效时保持现有确定性 respawn。 - Android Test App 新增 T0 EAST/T1 NORTH、MIX 0/50/100 与 ADVANCE B->C 入口;保留既有 ACTIVE/STATIC、mask、Camera、world-wrap 与 antimeridian 入口。 ## 验证边界 - Linux OpenGL 受影响 Core 与 source test object:通过。 - shader generator、二次生成稳定性、C++ format、`git diff --check`:通过。 - Codex 未运行 Android Gradle、ADB、APK 安装或设备测试;用户已在 Android x86_64 OpenGL 完成 T1--T10,全部 PASS。 ## 不在本 Step 范围 iOS/Metal、Vulkan、网络/真实气象数据、完整 forecast cache、Jest、最终性能基线均不在本任务范围。40-02 在 T1--T10 通过前不得标记 PASS。