diff --git a/docs/50_Step记录/STEP-047_Runtime_Timeline与Playback_v2.md b/docs/50_Step记录/STEP-047_Runtime_Timeline与Playback_v2.md new file mode 100644 index 000000000..200a0a809 --- /dev/null +++ b/docs/50_Step记录/STEP-047_Runtime_Timeline与Playback_v2.md @@ -0,0 +1,24 @@ +# STEP-047 Runtime Timeline 与 Playback(集中修复) + +状态:IMPLEMENTED / WAITING FOR ANDROID RE-VALIDATION + +## Android Validation Round 1 + +Round 1 结论:PARTIAL / NEEDS FIX。 + +已通过:Core Timeline READY、自动 MIX、自动 window advance、`OLD_T1 → NEW_T0` reuse、紧凑控制台、MAP/MORE 基础回归、VIS Core property 调用链。 + +失败或无法充分验证:Pause/Resume UX、速度可视性、Seek 状态语义、GAP/INVALID/RECOVER 入口、播放中 VIS、COLOR 可达性、Preload/Cache 可观测性。 + +## 本轮修复 + +- Validation 逻辑时间窗口从 4 秒扩展到 40 秒,6 snapshot 总时长约 200 秒;Core clock 不使用 Android timer。 +- PLAYING→PAUSED 和 PAUSED→PLAYING 保留 cursor;END 时 PLAY 明确从 start restart;END/WAITING 拒绝日志明确。 +- PLAYING 的非 END seek 保持 PLAYING;PAUSED seek 保持 PAUSED;Seek END 进入 ENDED;日志记录状态、cursor、目标窗口和 mix。 +- TIME 菜单直接提供 NORMAL、GAP、INVALID NEXT、RECOVER NEXT;GAP/INVALID 在边界 fail-closed,recover 恢复此前播放/暂停语义。 +- VIS 把 COLOR 放到第二项;Validation 调节步长扩大,状态行即时显示 W/L/O/T/F/C;状态行同时显示 Timeline state/speed。 +- 预加载仍是 Source 的有界 CPU snapshot cache(容量 8,绝不预上传未来 GPU Field);READY 输出 TIMELINE_PRELOAD,窗口推进输出 TIMELINE_CACHE_HIT。 + +## 不变项 + +自动 MIX、GPU T0/T1 window、`OLD_T1 → NEW_T0` reuse、只上传新 T1、无 Style reload/simulation reset/trail clear 的正常推进路径,及 STEP-046 visual property-only 均未改动。 diff --git a/docs/报告/40-06_Runtime_Timeline与Playback_Codex完成报告_v2.md b/docs/报告/40-06_Runtime_Timeline与Playback_Codex完成报告_v2.md new file mode 100644 index 000000000..af6edcfb2 --- /dev/null +++ b/docs/报告/40-06_Runtime_Timeline与Playback_Codex完成报告_v2.md @@ -0,0 +1,9 @@ +# 40-06 / STEP-047 集中修复完成报告 + +状态:IMPLEMENTED / WAITING FOR ANDROID RE-VALIDATION + +第一轮 Android 验收为 `PARTIAL / NEEDS FIX`,历史结论保留于 STEP-047 v2。此次修复将 Core logical window 拉长至约 200 秒;暂停/恢复、END restart、seek 状态保持、GAP/INVALID/RECOVER 与可见 speed/state 行为均已在 Core/Validation 层修正。 + +Source 仍是 Timeline 和 CPU preload cache 权威;Renderer 继续只消费当前 T0/T1/mix。CACHE/PRELOAD 日志来自真实 immutable Source entries,而非未来 GPU 上传。自动边界仍走既有 overlap GPU reuse。 + +未执行 Android Gradle、ADB、Jest 或设备测试;等待一次完整 Android Round 2。 diff --git a/include/mbgl/style/sources/raster_array_source.hpp b/include/mbgl/style/sources/raster_array_source.hpp index 9a157f320..d9f6c041e 100644 --- a/include/mbgl/style/sources/raster_array_source.hpp +++ b/include/mbgl/style/sources/raster_array_source.hpp @@ -77,6 +77,7 @@ private: RasterArrayPlaybackState state = RasterArrayPlaybackState::Ready; bool gap = false; bool invalid = false; + RasterArrayPlaybackState stateBeforeWait = RasterArrayPlaybackState::Paused; uint64_t windowRevision = 1; std::chrono::steady_clock::time_point lastTick{}; const size_t cacheCapacity_ = 8; diff --git a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/particle/ParticleCoreLayerValidationActivity.kt b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/particle/ParticleCoreLayerValidationActivity.kt index 5909124e6..d8d66ddcd 100644 --- a/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/particle/ParticleCoreLayerValidationActivity.kt +++ b/platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/particle/ParticleCoreLayerValidationActivity.kt @@ -34,6 +34,9 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() { private var timeWindowMode = false private var styleLoadEpoch = 0L private var styleReady = false + // Display mirror only; Core remains the playback state authority. + private var timelineState = "READY" + private var timelineSpeed = "1x" override fun onCreate(savedInstanceState: Bundle?) { active = savedInstanceState?.getBoolean(STATE_ACTIVE, true) ?: true @@ -111,6 +114,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() { timeWindowMode = true fixtureMode = FIXTURE_UNIFORM_EAST timeMix = 0.0f + timelineState = "READY" if (this::maplibreMap.isInitialized) loadValidationStyle(active, enabled, "TIME_WINDOW") } findViewById