diff --git a/docs/60_测试/30_02_GPU_PingPong与ContextRecreation最小技术验证报告_v4.md b/docs/60_测试/30_02_GPU_PingPong与ContextRecreation最小技术验证报告_v4.md new file mode 100644 index 000000000..f734e7b75 --- /dev/null +++ b/docs/60_测试/30_02_GPU_PingPong与ContextRecreation最小技术验证报告_v4.md @@ -0,0 +1,69 @@ +# 30-02 GPU Ping-Pong 与 Context Recreation 最小技术验证报告 v4 + +日期:2026-08-30 + +当前状态:`WAITING_MANUAL_VALIDATION` + +## 1. 已确认实机状态与本轮问题 + +用户已确认此前 C++ STATIC freeze 修复有效:在 STATIC 下 pan、zoom、bearing、pitch 触发的普通 MapLibre redraw 不再推进 GPU simulation。DISABLE / ENABLE 也已由用户确认正常。 + +本轮 Android OpenGL 实机发现是另一层问题:屏幕旋转触发 Activity recreation 后,旋转前的 `STATIC + ENABLED` 被恢复成 `ACTIVE + ENABLED`。 + +该现象不改变已确认的 C++ STATIC freeze 结论;它是 Test App validation control mode 未在标准 Android Bundle 中恢复的问题。 + +## 2. 根因 + +`ParticleCoreLayerValidationActivity` 在 Activity 存活期间已经由 `loadValidationStyle(active, enabled)` 维护两个成员状态。但旧代码: + +- 没有在 `onSaveInstanceState()` 保存 `active`、`enabled`; +- 在 `onCreate()` 的 Map callback 中无条件调用 `loadValidationStyle(active = true, enabled = true)`; +- 同时无条件重置相机到 `(0, 0), zoom=2`。 + +因此标准旋转 recreation 无论此前为 STATIC、ACTIVE 或 DISABLED,都会退回 ACTIVE + ENABLED。 + +## 3. 定向修复 + +仅修改: + +- `platform/android/MapLibreAndroidTestApp/src/main/java/org/maplibre/android/testapp/activity/particle/ParticleCoreLayerValidationActivity.kt` + +具体调整: + +- 新增稳定 Bundle key:`particle_validation.active`、`particle_validation.enabled`; +- `onCreate()` 在 Map 初始化前恢复两个成员变量,首次进入默认 ACTIVE + ENABLED; +- `getMapAsync` 只在首次进入时设置默认 camera;recreation 时保持 MapView 的已保存状态; +- 恢复后的 `active/enabled` 仍只通过既有 `loadValidationStyle()` 应用 style 与页面状态; +- `onSaveInstanceState()` 写入两个 validation control 值,同时保留原有 MapView state 保存顺序; +- 新增低频日志:`Activity state restored active=<...> enabled=<...> recreated=<...>`。 + +未修改 AndroidManifest、layout、strings、C++ Core、gfx、RenderLayer、shader、GPU state、Gradle 或依赖。没有使用 `configChanges`、方向锁定、static/global、SharedPreferences、ViewModel 或 GPU 状态序列化。 + +## 4. 静态检查 + +- S1:Activity 中已不存在 recreation 后无条件 `loadValidationStyle(active = true, enabled = true)`:PASS。 +- S2:`savedInstanceState == null` 时默认 ACTIVE + ENABLED 且设置初始 camera:PASS。 +- S3:ACTIVE、STATIC、DISABLE、ENABLE 按钮仍调用唯一 `loadValidationStyle()`:PASS。 +- S4:`loadValidationStyle()` 继续统一更新成员状态、style 和状态文字:PASS。 +- S5:没有 Manifest workaround、持久化、全局状态或 GPU 资源状态:PASS。 +- `git diff --check`:PASS。 +- Kotlin/Android 编译、Gradle、ADB、安装与实机运行:未执行,遵守任务限制。 + +## 5. Rotation 重新验证 + +使用包含代码提交 `503f1c66958798ef7294165c3ddeaffbd4908ee9` 的新 APK。日志过滤: + +```bash +adb -s 192.168.1.146 logcat | grep -E 'ParticleValidation30_02|ParticleValidation' +``` + +1. R1 STATIC rotation:ACTIVE 运行几秒 → STATIC → 确认停止 → 竖屏/横屏互转两次。每次日志应为 `active=false enabled=true recreated=true`,页面保持 STATIC,不能自动 ACTIVE。 +2. R2 ACTIVE rotation:ACTIVE 下旋转,日志应为 `active=true enabled=true recreated=true`,页面保持 ACTIVE。 +3. R3 DISABLED rotation:DISABLE 后旋转,日志应为 `active=<切换前值> enabled=false recreated=true`,页面保持 DISABLED,不能自动 ENABLE。 +4. R4 STATIC gesture regression:STATIC 下 pan、zoom、bearing、pitch;地图正常 redraw,但 GPU simulation 仍不得推进,验证本轮没有破坏 v3 的 C++ freeze。 + +## 6. 判定边界 + +Rotation 通过只能证明 validation control mode 在 Activity recreation 后恢复正确;它不能单独判定 T4 viewport resize 或 T6/T7 context/resource recreation PASS。旋转路径可能同时重建 Activity、MapView、RenderLayer 和 GPU resources,旧 Trail 不要求跨 Activity 保存。 + +30-02 总体状态仍为 `WAITING_MANUAL_VALIDATION`,等待 R1–R4 人工证据;不得写 PASS,也不允许进入 30-03。 diff --git a/docs/报告/30_02_GPU_PingPong与ContextRecreation验证_Codex完成报告_v4.md b/docs/报告/30_02_GPU_PingPong与ContextRecreation验证_Codex完成报告_v4.md new file mode 100644 index 000000000..1f3285bbc --- /dev/null +++ b/docs/报告/30_02_GPU_PingPong与ContextRecreation验证_Codex完成报告_v4.md @@ -0,0 +1,56 @@ +# 30-02 GPU Ping-Pong 与 Context Recreation 验证 Codex 完成报告 v4 + +日期:2026-08-30 + +执行结论:`WAITING_MANUAL_VALIDATION` + +## 1. 任务基线 + +- 分支:`particle/main`。 +- 本轮开始 HEAD:`625836fcaf1474c51210f51b95dc9adeafdead9d`。 +- 30-01:正式 `PASS`。 +- 30-02:仍为 `WAITING_MANUAL_VALIDATION`。 +- 开始时存在用户提供、未跟踪的本定向修复指令书;它保留在工作区,未修改或提交。 + +## 2. 用户实机输入 + +用户确认 C++ STATIC freeze 已通过手势回归,DISABLE / ENABLE 正常;同时发现旋转后 STATIC 恢复为 ACTIVE。该问题发生在 Android Activity recreation 的 Test App control mode,不是 GPU ping-pong 或 MapLibre redraw 问题。 + +## 3. 根因与修复 + +根因是 Activity 未向 Bundle 写入 `active/enabled`,且 recreation 后 `onCreate()` 无条件把 validation style 设为 ACTIVE + ENABLED,并重置相机。 + +修复仅在 `ParticleCoreLayerValidationActivity.kt`: + +- 以稳定 Bundle key 保存/恢复 active 与 enabled; +- 只在首次 Activity 创建时初始化 camera; +- callback 使用恢复成员值调用唯一 `loadValidationStyle()`; +- 增加一次恢复日志; +- 保留既有 MapView lifecycle/state 保存与四个按钮状态机。 + +没有修改 Manifest、C++、gfx、RenderLayer、shader、GPU resource lifecycle、Gradle、依赖或 Test App UI。没有引入任何绕过 Activity recreation 的机制。 + +## 4. 检查与未执行项 + +- `git diff --check`:PASS。 +- Bundle key、初始默认值、统一 style 入口、旧硬编码删除和禁止项静态检索:PASS。 +- Kotlin formatter 工具在环境中不可用;未声称 Kotlin lint PASS。 +- Android/Gradle/ADB/安装/运行以及任何编译:未执行,遵守用户限制。 + +## 5. 重新验证与范围 + +技术报告 v4 给出 R1 STATIC、R2 ACTIVE、R3 DISABLED rotation 和 R4 STATIC gesture 回归。必须通过 Android OpenGL 实机日志确认恢复状态;Rotation control-mode 恢复不等价于 T4 resize 或 T6/T7 context recreation PASS。 + +当前不允许进入 30-03。 + +## 6. Git 收尾 + +- 代码 commit:`503f1c66958798ef7294165c3ddeaffbd4908ee9`。 +- 代码 message:`fix: preserve particle validation mode on rotation`。 +- 代码 push:成功,远端分支 `origin/particle/main`。 +- v4 文档实质提交及最终远端 HEAD 按元数据收尾规则在最终回复中记录。 +- 除用户提供的未跟踪指令书外,无本任务无关本地修改。 + +## 7. 当前状态 + +本轮仅完成 Rotation state restoration 代码准备。R1–R4 尚待用户手工验证,故最终状态保持 `WAITING_MANUAL_VALIDATION`。 diff --git a/粒子开发记录.md b/粒子开发记录.md index e14f0b005..9373063b7 100644 --- a/粒子开发记录.md +++ b/粒子开发记录.md @@ -106,3 +106,14 @@ - 修复后的 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`。