Files
MapLibreParticleLab/docs/20_调查/STEP-111_R段Placement结果等价与独立刷新可行性调查_v1.md
tei 50ae48ad70
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
docs: record STEP-111 per-R placement feasibility partial
2026-10-10 17:07:15 +09:00

7.3 KiB
Raw Permalink Blame History

STEP-111:R 段 Placement 结果等价与独立刷新可行性调查 v1

日期:2026-10-10|状态:PARTIAL(初步可行性判断,不是 Codex 完整设计或运行验收)

1. 范围及真实证据

  • Mac /Users/tei/dev/MapLibreParticleLab,particle/main;调查时 HEAD 7ec9ac8c1635c7a3b607abc2ed4be4fd764e7b6d。Integration main 与 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 逐行核验)

  1. src/mln/renderer/render_orchestrator.cpp:775-810:Continuous 渲染使用 placementController.placementIsRecent 得到全局 placementChanged,随后视情况新建 Placement、调用 placeLayers(layersNeedPlacement) 并更新 Controller;symbolFadeChange 和过渡也作为全局状态处理。这里的 placementChanged 表示重算触发,不证明每一个 R 的最终输出改变。
  2. include/mln/renderer/render_segment.hpp:78-90:R 中只要出现 layerType == "symbol" 就被标为 placementCapable;Gate 对这种 R 要求全局 !placementChanged && symbolFadeChange==0 && !placementTransitionActive。没有 per-R 最终 Symbol 结果比较。
  3. 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 段的逐段结果等价证据。
  4. STEP-110 已核对的 src/mln/text/placement.cpp CollisionGroups/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. 后续建议及未完成项

  1. 下一次正式任务先补只读源码数据所有权审计:Placement 完成后在哪个对象/时间点能列出每 R 所属 symbol 的最终 placed/opacity,并确定 crossTileID、tile/glyph 资源失效契约。输出字段级“已有/缺失/必须新增”清单。
  2. 再授权仅做 shadow-mode 内部诊断:per-R resultComparable/resultChanged/unknown 与 global Gate 同步采样,不改变 Gate;采样成本与候选数量需量化,防止 O(N) 比较本身抵消收益。
  3. 真实 RCRCRC(每个 R 含 Symbol)覆盖同 Source/跨 Source 碰撞开关、Annotation、Fade、Camera、Tile、Layer 顺序及前后多帧;全缓存 ON/OFF 视觉一致,false reuse 必须为零。
  4. 通过后才另行授权 C 阶段优化,先看独立 R build/reuse/fallback 与 CPU/帧变化;Fast Path 对单 C、pending、non-particle repaint 等另有门槛,不作为此优化的当然收益。
  5. 若出现跨平台公共语义/公共接口改变,回 Integration RFC/ADR 处理;本阶段不得更改现有 API/Contract。

未完成: Codex 未形成字段级可行性结论;无 per-R Placement 结果签名、运行对照、性能证据或真实 Native 修复。不可标“调查 PASS”或“独立刷新已实现”。