Files
StellarX-kaifa/开发记录/Fix/Fix-BUG-20260511-0010-局部提交overlay补画coverage兜底修复.md
T
Codex 9155a86a8a 发布前托管重绘与布局封版收口
收口 Dialog/overlay 后鼠标状态同步、Tooltip 临时 coverage 与持久 coverage 拆分、跨 root 脏区补提交、TextBox/Button 绘制副作用修复,并补充 KEY6 回归用例和 BUG/Fix/Feature 开发记录。
2026-05-17 00:26:08 +08:00

2.5 KiB
Raw Blame History

Fix-BUG-20260511-0010

适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。

关联信息

  • Fix ID: Fix-BUG-20260511-0010
  • 关联 BUG ID: BUG-20260511-0010
  • 修复目标: 避免局部 root 内部 coverage 扩张后漏补 Dialog / 上层 overlay
  • 状态:已完成
  • 负责人: Codex
  • 分支 / 版本: 当前工作区

根因分析

  • 根因: commitManagedRepaint() 只执行绘制,不返回本轮实际写屏 coverage;Window 仍按登记时的初始 coverage 进行上层补画判断。
  • 触发条件: Canvas / TabControl 内部局部提交中补画了后序兄弟控件,实际写屏范围大于初始 source coverage。
  • 为什么之前没发现:[可选] 需要 Dialog、Tooltip、后序兄弟补画三者同时满足。
  • 关键证据:[可选] 临时日志中 Canvas partial end coverage 已与 Dialog 相交,但 dialog overlay check 使用旧 working coverage 结果为不相交。

修复方案

  • 修复思路: 在 Window 层进行保守兜底。root 局部提交完成后,如果 root 仍支持局部提交,则将 root 当前 managed coverage 并入上层补画判断 coverage。
  • 关键改动:
    • Window::flushManagedRepaint()root->commitManagedRepaint() 后合并 root->getManagedRepaintCoverageRect()
    • 只扩大上层补画判断,不改变 root 自身局部提交策略。
  • 涉及文件 / 类 / 函数: Window.cpp::flushManagedRepaint
  • 影响的 API / 行为:[可选] 无公开 API 变化。
  • 关键约束 / 不变量:[可选] Dialog 仍保持顶层 overlay 语义。
  • 回滚点 / 开关:[可选] 回退该 coverage 合并逻辑。

影响评估

  • 影响范围: 托管重绘后的上层普通控件 / Dialog 补画判断。
  • 兼容性影响:无
  • 行为变化:有(Dialog / 上层控件补画更保守)
  • 性能影响:有(可能多补画少量 overlay)
  • 回归风险: 中低;主要风险是局部 root 大范围覆盖时上层补画次数增加。

验证结果

  • 验证步骤:
  1. 编译 Window.cpp / Canvas.cpp
  2. 编译 z-testDome.cpp /DKEY=6
  3. 编译 z-testDome.cppKEY1 ~ KEY6
  • 验证结果: 编译通过;临时日志已删除
  • 回归检查:[可选] KEY6 非模态 Dialog + Tooltip 覆盖链待用户手测
  • 验证证据:[可选]

落地信息

  • Commit: 未提交
  • PR[可选]
  • 发布版本:[可选]
  • 备注: 下版本建议让 commitManagedRepaint() 返回 actual coverage,替代 root 全覆盖兜底。