fix: 修复 V15 WeatherColor Metal 纹理生命周期
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
This commit is contained in:
83
docs/报告/V15_iOS_WeatherColor纹理生命周期修复_Codex完成报告_v1.md
Normal file
83
docs/报告/V15_iOS_WeatherColor纹理生命周期修复_Codex完成报告_v1.md
Normal file
@@ -0,0 +1,83 @@
|
||||
# V15 iOS WeatherColor 纹理生命周期修复 Codex 完成报告 v1
|
||||
|
||||
日期:2026-09-27(JST)
|
||||
结论:**IMPLEMENTED / WAITING FOR RDC MAC VALIDATION AND MANUAL IPAD VALIDATION**。源码修复已实施,测试代码已添加;没有运行构建或测试,不能标记 Metal/iPad PASS。
|
||||
|
||||
## 1. 执行配置与 Git 基线
|
||||
|
||||
- 实际执行模型与档位:**GPT-6 Luna High**(按本轮用户指定记录;未切换或升级)。
|
||||
- 仓库:`/Users/tei/dev/MapLibreParticleLab`;机器:Mac mini,Darwin 24.6.0,x86_64。
|
||||
- 分支:`particle/main`;开工/当前 HEAD:`cd71640a84901212ce4681e296f027befdff4ee0`。
|
||||
- V15 tag `maplibre-particle/rn/13.4.1-particle.15` peeled commit 与 HEAD 相同;`origin/particle/main` 与 HEAD 相同。
|
||||
- manifest 中的 V15 `sourceCommit` 是 `1fdc5df625d405233703136eb2dc12032d932da2`;后续 finalize release 生成的 V15 tag 指向 HEAD `cd71640a84901212ce4681e296f027befdff4ee0`。两者角色不同且本任务相关已跟踪源码相同,因此不存在基线冲突。任务书保留原样,tag/发行内容未修改。
|
||||
- 开工工作树只存在用户提供且未跟踪的 V15 任务书;本轮保留未跟踪状态。没有 stage、commit、push、reset、clean、版本/tag/发行包覆盖。
|
||||
- `platform/android/VERSION` 为 `13.4.1-particle.15`;`platform/ios/VERSION` 当前内容为 `6.28.0`。本轮未改版本坐标。
|
||||
|
||||
## 2. 根因链和修复
|
||||
|
||||
源码复核确认:`RenderWeatherColorLayer::update()` 上传/替换 Resources 中的纹理,但旧 Drawable 仅在 wrap 区间变化时重建;Metal `LayerGroup::upload()` 先于 `render()`;旧 Tweaker 在 `render()` 阶段才将新纹理写入 Drawable。`gfx::Drawable::setTexture()` 仅更换资源指针,不会补做前序 upload,因此新 Metal texture 可能在 draw 时仍为 dirty。IPS 不包含 Drawable/Texture ID,不能据此声称事故中的确切对象身份已由日志证明。
|
||||
|
||||
修复在 update 阶段比较 Drawable 原有与期望的 T0/T1 实际纹理指针。wrap 范围或任一 endpoint 指针变化时,当场重建该层 drawables,确保 builder 在本帧 upload 前安装纹理。Tweaker 不再绑定纹理,只更新 UBO 动态值。`assert(!textureDirty)` 和 Metal 通用绑定逻辑未改。
|
||||
|
||||
指针转移结果:
|
||||
|
||||
| 场景 | 指针比较 | 预期动作 |
|
||||
|---|---|---|
|
||||
| T0/T1 均不变 | 两指针相同 | 不重建、不重传 |
|
||||
| 仅 T0 或仅 T1 被替换 | 一指针不同 | update 阶段重建 |
|
||||
| 两端均替换 | 两指针不同 | update 阶段重建 |
|
||||
| 旧 T0/T1 交叉复用 | 顺序变化 | update 阶段重建 |
|
||||
| T0=T1 | 相同共享指针 | 保持时不重建;从双端切换/反向时重建 |
|
||||
| 仅 mix/opacity/stops 改变 | endpoint 不参与这些参数 | Tweaker 更新 UBO,不重建/重传 |
|
||||
| wrap 改变 | endpoint 可相同 | 重建 wrap drawables |
|
||||
| Resources 清空后恢复 | null → 新端点且 wrap 哨兵失配 | 新建资源与 drawables |
|
||||
|
||||
## 3. 实际修改文件
|
||||
|
||||
- `include/mbgl/renderer/layers/weather_color_texture_lifecycle.hpp`:新增 drawable endpoint/wrap 重建判定 helper。
|
||||
- `src/mbgl/renderer/layers/render_weather_color_layer.cpp`:update 阶段检测 endpoint 指针并重建;Tweaker 删除 draw 阶段纹理绑定。
|
||||
- `test/renderer/weather_color_texture_lifecycle.test.cpp`:新增六组指针/生命周期决策测试。
|
||||
- `test/CMakeLists.txt`:将新测试加入 CMake test target;Bazel 通过既有测试 glob 收录。
|
||||
- `docs/50_Step记录/V15_iOS_WeatherColor纹理生命周期修复_v1.md`:新增本阶段记录。
|
||||
- `粒子开发记录.md`:追加本轮事实。
|
||||
- 本 Codex 完成报告。
|
||||
|
||||
没有更改 V15 任务书、V12/V13、JS/RN、NavSea 宿主 API、Android、release pipeline、release tag/archive/manifest/version、粒子 advection/State/Trail/Retained、公共 API/ABI、Layer ID、Z-order、shader slot 或 Metal assert。
|
||||
|
||||
## 4. 检查和验证结果
|
||||
|
||||
| 检查 | 结果 |
|
||||
|---|---|
|
||||
| 源码调用链只读复核 | 已完成;事实和限制如上 |
|
||||
| `git diff --check` | **PASS**(已跟踪 diff 无 whitespace error;新增文件另行查看,未纳入该命令的 Git diff 范围) |
|
||||
| RDC 首次 OpenGL host 编译 | **FAIL**:`test/renderer/weather_color_texture_lifecycle.test.cpp:60:17` 的 `nullptr` 参数无法参与模板类型推导;RDC 同时反馈 production `render_weather_color_layer.cpp` object 已编译 |
|
||||
| OpenGL host 修正 | 已将该断言调用写为 `weatherColorDrawableBindingsChanged<int>(...)`,仅修正测试 helper 的模板类型推导 |
|
||||
| RDC OpenGL host build retry | **PASS**, exit 0 |
|
||||
| RDC OpenGL 定向 GTest | **PASS**, 6/6 |
|
||||
| RDC Metal host 编译 | **PASS**, exit 0 |
|
||||
| RDC Metal host 定向 GTest | **PASS**, 6/6 |
|
||||
| iOS/Xcode build、签名、安装 | 未执行,用户按项目边界手工完成 |
|
||||
| iPad Metal 运行、崩溃断言/内存/纹理计数 | 未执行,等待人工集中验收 |
|
||||
| Android/Gradle/APK/ADB/Jest/JS | 未执行 |
|
||||
| commit/push/release pipeline | 未执行 |
|
||||
|
||||
## 5. RDC Mac 精确命令
|
||||
|
||||
按 OpenGL → Metal host 顺序执行;每个 build 成功后运行该新增测试:
|
||||
|
||||
```bash
|
||||
cmake --build build-step088-opengl --target mbgl-test-runner --parallel 3
|
||||
build-step088-opengl/mbgl-test-runner --gtest_filter='WeatherColorTextureLifecycle.*'
|
||||
cmake --build build-step097-metal-host --target mbgl-test-runner --parallel 3
|
||||
build-step097-metal-host/mbgl-test-runner --gtest_filter='WeatherColorTextureLifecycle.*'
|
||||
```
|
||||
|
||||
RDC 日志目录:`/tmp/navsea_v15_weathercolor_validation/`。日志文件:`opengl_build.log`(首轮失败)、`opengl_build_retry.log`(重试成功)、`opengl_test.log`(6/6)、`metal_host_build.log`(成功)、`metal_host_test.log`(6/6)。未从回传摘要/日志记录到耗时,因此不补写耗时。Metal host 结果不是 iOS 真机通过。
|
||||
|
||||
## 6. 限制、剩余风险与人工验收
|
||||
|
||||
- 新测试覆盖 endpoint 判定矩阵,不是 drawable/Metal GPU 端到端模拟;`upload()` 到 draw 的实际时序仍需 RDC Mac host 验证和 iPad 验收。
|
||||
- 任务书引用的事故 IPS 与外部调查报告未在本机读取;没有推断其中未提供的内容。源代码链是可推导的候选根因,而非 IPS 已证明纹理 ID。
|
||||
- iPad 需使用后续正确版本 Native 手工编译;先核对二进制 UUID,再执行冷启动风场、风→浪→风、风→雨→潮→风、邻帧/第九帧淘汰后重入、快速 Seek、天气关闭重开、平移缩放、前后台和旋转。检查 assert/crash、WeatherColor/Particle 画面、上传/重建次数、内存及异常日志。本船放大、上层闪烁和 Android 场景独立验收。
|
||||
- 未发现 `STEP_RECORD.md`;本轮按根规则更新 Step 记录并追加 `粒子开发记录.md`。
|
||||
- 当前结论为源码已实施、RDC OpenGL/Metal host 定向验证 PASS,等待用户手工 iPad 验收;host PASS 不代表设备 PASS。Codex 阶段按用户授权 scoped commit/push 到 `origin/particle/main`,commit 和回读的远端 HEAD 记录在本报告后续 Git 收尾项及最终交付中。iPad 实测通过前状态不得提升为 CLOSED/PASS。
|
||||
Reference in New Issue
Block a user