Files
StellarX-kaifa/开发记录/BUG/BUG-20261009-0002-同父Canvas并发脏子树导致上层区域被下层重绘覆盖.md

56 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# BUG-20261009-0002
> 适用场景:记录问题本身,不展开完整修复方案。修复内容写入对应的 Fix 文档。
## 基本信息
- ID: BUG-20261009-0002
- 标题: 同父 Canvas 并发脏子树导致上层区域被下层重绘覆盖
- 状态:已修复,自动回归通过,KEY5 人工复验待执行
- 严重性:S2
- 优先级:P1
- 模块: Canvas / Managed Repaint / Overlay / Focus
- 版本 / 分支: `master`,阶段 3 实现提交 `29df994`
- 环境: Windows + EasyX + KEY5 D-1/D-2 同父 overlay
- 发现人: 用户 KEY5 人工回归
- 关联 Fix ID: Fix-BUG-20261009-0002
## 问题描述
- 现象: 焦点从 KEY5 的 D-1 下层按钮转移到 D-2 上层按钮时,下层失焦重绘会覆盖 D-2 的一部分;如果没有后续事件再次触发完整重绘,错误像素会持续存在。
- 影响范围: 同一 Canvas 内发生区域相交的上下层兄弟,并且下层持久内容与上层脏子树在同一批次提交。
- 期望结果: 只要下层本轮持久写屏区域与上层兄弟相交,上层兄弟必须基于当前屏幕重新抓背景并完整恢复,不能只提交自己的局部脏后代。
## 复现信息
- 前置条件: 两个相交 Canvas 按绘制顺序形成下层和上层;二者各有可聚焦 Button。
- 复现步骤:
1. 启动 KEY5。
2. 在 C 米区离开后使焦点进入 D-1 下层按钮。
3. 再把焦点移到 D-2 上层按钮。
4. 不触发额外重绘,观察 D-2 与 D-1 的相交区域。
- 复现概率:用户人工路径可复现
- 人工证据: 用户截图显示 D-1 重绘像素覆盖 D-2 上层区域。
## 根因分析
- `Canvas::requestRepaint()` 依绘制顺序提交脏子树并累计实际 coverage。
- 旧分支优先判断“当前上层兄弟自己是否有脏子树”。当 D-2 的 Button 同时获焦时,代码只提交 D-2 的局部脏子树。
- 此时 D-1 已经把持久像素写进 D-2 区域;仅画 D-2 的 Button 无法恢复 D-2 Canvas 背景和其它未脏内容,因此留下错误覆盖。
## 跟踪信息
- 首次发现时间: 2026-10-09
- 最后更新时间: 2026-10-09
- 修复版本: `29df994`
- 验证版本: 扩展 focus UI 3/3、完整 UI 1/1、四配置 67/67 与 KEY1–KEY6 编译通过
- 关联记录: `BUG-20260415-0005`、`BUG-20260511-0012`、`Module-20261009-0007`
## 关闭边界
- 自动像素测试已覆盖“下层失焦 + 上层获焦同批发生”并断言相交点仍为上层背景色。
- Tooltip 临时 coverage 仍不触发持久快照刷新;完整 tooltip UI 已通过。
- BUG 最终人工关闭仍需用户复验 KEY5 D 区。