7.3 KiB
STEP-111:R 段 Placement 结果等价与独立刷新可行性调查 v1
日期:2026-10-10|状态:PARTIAL(初步可行性判断,不是 Codex 完整设计或运行验收)
1. 范围及真实证据
- Mac
/Users/tei/dev/MapLibreParticleLab,particle/main;调查时 HEAD7ec9ac8c1635c7a3b607abc2ed4be4fd764e7b6d。Integrationmain与origin/main一致于80667d6c343411d03a760425438e3d292f452118。 - 使用可见 GNU Screen
7445.codex,真实界面显示 GPT-6 Astra high;Codex 进行两轮源码浏览/调查后长期无新事件,第二轮缩窄至直接写报告仍无输出,随后终止会话;未生成任何要求的 STEP-111 正式调查文档。此文件由 GPT/RDC 对当下代码和既有 STEP-110 证据重新核对后撰写,不冒称 Codex 已完成 STEP-111。 - 未改 C++/Swift/Kotlin/JS/测试代码,未编译、未测试、未跑设备;本文件是方案评估,不是新增 Native 功能。
2. 现有实现的确定事实(RDC 逐行核验)
src/mln/renderer/render_orchestrator.cpp:775-810:Continuous 渲染使用placementController.placementIsRecent得到全局placementChanged,随后视情况新建 Placement、调用placeLayers(layersNeedPlacement)并更新 Controller;symbolFadeChange和过渡也作为全局状态处理。这里的placementChanged表示重算触发,不证明每一个 R 的最终输出改变。include/mln/renderer/render_segment.hpp:78-90:R 中只要出现layerType == "symbol"就被标为 placementCapable;Gate 对这种 R 要求全局!placementChanged && symbolFadeChange==0 && !placementTransitionActive。没有 per-R 最终 Symbol 结果比较。src/mln/renderer/renderer_impl.cpp:638-686:对每个 RETAINED 段已经独立计算内容 fingerprint、Source ready/stable/revision、segmentStable、placementCapable,并在cache->evaluate决定复用、构建或 fallback;static-placement是 Gate 未通过时的失败原因。逐 R Cache 管理已存在,缺的是含 Symbol 段的逐段结果等价证据。- STEP-110 已核对的
src/mln/text/placement.cppCollisionGroups/opacity/fade 说明:Collision Domain 与 RenderSegment 边界不等价;跨 Source 碰撞开关、同 Source 跨段、text/icon Fade 等可能让别的段影响本段可见结果。STEP-102/106 仅能证明 placement-free 的安全复用,不直接证明含 Symbol R 的安全复用。
3. 推荐的目标语义(待设计与实测)
R0-C0-R1-C1-R2-C2 六段按图层顺序合成;若 R1 内 Symbol 的最终绘制结果与其上次成功 Build 的缓存版本等价,允许 R1 复用,而不因某个 R0/R2/C 段触发 global placementChanged 自动 Fallback。跨段碰撞真的改变 R1 Symbol 的显隐、锚点、位置、opacity 或其它绘制依赖时,R1 必须失效。
不等于每个 R 拥有独立 Collision Index。第一阶段可以仍全图计算 Placement,之后对不同 R 的已完成结果分别判等,再控制各段纹理的 Build/Reuse;这只争取避免不必要的段重绘,不能自动省略全局 prepare/Placement、非 R 的 C 绘制或保证 Fast Path hit。
待验证的候选签名(不是已实现结构)
建议研究在 placeLayers 完毕之后、renderer_impl.cpp:638-686 Cache 决定之前提供 per-R PlacementResultRevision 或严格结果比较,关联已缓存 Build 版本,而不只与上一帧比较。候选依赖包括:
- 按层序可稳定归属到 R 的 text/icon 实例、Tile/Bucket/Source 世代与 placement/collision 可见性、锚点、偏移、实际绘制位置;
- Fade/Opacity/Transition 的可绘制值或明确的“稳定可复用”条件;纹理/glyph/sprite/atlas 的有效世代;
- Camera/projection/zoom/viewport/pixelRatio、Style 顺序与合成边界;这些可优先复用已有 Camera/Content/Resource Gate,不应盲目重复扫描;
- 新旧结果缺失、ID 不稳定、资源生命周期不可证明、哈希碰撞或任意未知场景均 fail-closed。
上述字段只是候选调查清单,现有代码尚未证明可以低开销取得稳定、完整的 per-R 视觉语义。简单“Symbol ID/位置没变”或单一 64-bit hash 相等都不足以证明最终像素安全等价。
4. RCRCRC 反事实场景
| 情况 | 希望达到的复用决策 | 当前证据边界 |
|---|---|---|
| C1 只有粒子/颜色更新,R0/R1/R2 视觉稳定 | R0/R1/R2 独立复用 | 当前 global Gate 可能挡住含 Symbol R;仍须取得最终结果不变证据 |
| C1 Symbol 改变,仅使 R2 发生碰撞结果变化 | R2 重建;R0/R1 如证实未变可复用 | 事件来源不能替代逐 R 结果比较 |
| C1 Symbol 改变,同时影响 R0 与 R1 | R0/R1 失效、不得复用旧遮挡 | 必须保留全局 Collision 正确性 |
| R1 自身 Layer/Tile/Style 更改,R0/R2 不变 | R1 失效;其余分别判等 | 现有内容 revision 可局部区分,但 Symbol 仍有全局 Gate |
| Camera/Zoom/Pitch、Annotation、Fade、Glyph 变化 | 受影响 R 失效;未知则全体安全回退 | 不得将各段等同独立碰撞域;须验证跨平台一致性 |
5. 难度分级(GPT/RDC 初估,尚未经 Codex 最终复核)
| 阶段 | 复杂度 1–5 | 输出与主要难点 |
|---|---|---|
| A:只读设计 + 逐 R trace/reason | 2–3 | 诊断 event 来源与 per-R Cache 状态,不改变业务 |
| B:Native per-R result fingerprint 的 shadow compare | 3 | 找齐最终 Placement 数据、稳定身份/世代、控制逐帧遍历成本;只记录,不参与复用 |
| C:用已验证等价结果替换含 Symbol R 的 global-only Gate | 4 | 与 Cache 生命周期/资源/层序/Fade 联动,必须零 false-reuse;Android OpenGL、iOS Metal 对照 |
| D:真正把全图 Placement/Collision 改成分段增量计算 | 5 | 全局碰撞依赖与跨 Tile/Source 的更新传播,风险明显更高、不能简单按 R 切分 |
工程周期目前无法从静态代码得到可信承诺。复杂度 3 表示可做有限验证原型;4 代表需多阶段视觉/性能门槛;5 代表核心架构重构,不能与缓存命中优化混为一谈。
6. 后续建议及未完成项
- 下一次正式任务先补只读源码数据所有权审计:Placement 完成后在哪个对象/时间点能列出每 R 所属 symbol 的最终 placed/opacity,并确定 crossTileID、tile/glyph 资源失效契约。输出字段级“已有/缺失/必须新增”清单。
- 再授权仅做 shadow-mode 内部诊断:per-R
resultComparable/resultChanged/unknown与 global Gate 同步采样,不改变 Gate;采样成本与候选数量需量化,防止 O(N) 比较本身抵消收益。 - 真实 RCRCRC(每个 R 含 Symbol)覆盖同 Source/跨 Source 碰撞开关、Annotation、Fade、Camera、Tile、Layer 顺序及前后多帧;全缓存 ON/OFF 视觉一致,false reuse 必须为零。
- 通过后才另行授权 C 阶段优化,先看独立 R build/reuse/fallback 与 CPU/帧变化;Fast Path 对单 C、pending、non-particle repaint 等另有门槛,不作为此优化的当然收益。
- 若出现跨平台公共语义/公共接口改变,回 Integration RFC/ADR 处理;本阶段不得更改现有 API/Contract。
未完成: Codex 未形成字段级可行性结论;无 per-R Placement 结果签名、运行对照、性能证据或真实 Native 修复。不可标“调查 PASS”或“独立刷新已实现”。