起因
在使用 Claude Code 进行长时间对话时,发现上下文压缩(compact)后,终端显示会出现异常:旧内容以静态位图形式残留,叠加在当前输出之上。
这个问题在同时打开多个终端实例、GPU 内存压力较大时更容易复现。
发现过程
初步观察
- 残留内容是先前对话的片段,类似屏幕截图
- 同一个有问题的字形,其错误图形是固定的
- 拆分终端窗格再关闭可以清除残留
原因分析
- 终端层面:GPU 纹理缓存在显存压力时未能正确清理
- 应用层面:压缩后未主动发送刷新序列
Hook 验证
文档中有 PreCompact hook,尝试配置 PostCompact hook:
- ✅ Hook 存在且可触发
- ❌ 运行在子进程,无法影响主进程的终端显示
参考 Issue #35816 也确认了这一点。
贡献行动
1. VS Code Issue
提交终端 GPU 纹理缓存问题。
Issue 编号: #315782(opens in a new tab)
状态: ✅ 已提交
环境: VS Code 1.119.0, RTX 3060 Laptop GPU (6GB), Windows 10
复现: 6-7 个 Claude Code 窗口同时运行,压缩后出现残留
特征: 同一错误字形总是相同错误图案(缓存纹理问题)
2. Claude Code Issue
提交压缩后终端残留问题。
Issue 编号: #58094(opens in a new tab)
状态: ✅ 已提交 | ⚠️ Bot 检测为可能重复(已回复说明差异)
Bot 检测重复: #53406, #32480, #50658
差异说明:
- #53406: 浮动 UI 元素残留
- #32480: 对话框关闭后残留
- #50658: 输入缓冲区幽灵重现
这些是不同的触发源和症状。
3. Issue #54536 评论
澄清 PostCompact hook 已存在但功能有限。
评论链接: #54536#issuecomment-4423410692(opens in a new tab)
技术分析
为什么会产生残留?
正常情况:
终端 → 渲染 → GPU 纹理缓存 → 显示
压缩时:
压缩触发 → GPU 压力增大 → 纹理缓存被换出 → 新内容渲染
↓
旧纹理未被正确清理 → 新内容叠加在旧内容上 → 残留
为什么 Hook 无法解决?
PostCompact hook 运行在子进程中,只能做数据层面的处理(如状态更新),无法影响主进程的终端渲染。
后续计划
- 等待 VS Code 团队回应
- 等待 Claude Code 团队回应
- 考虑文档 PR 补充 PostCompact hook
收获
- PostCompact hook 已存在但未记录在公开文档
- 子进程 hook 无法影响主进程 UI
- 终端 GPU 纹理缓存是独立层面的问题
相关链接
- VS Code Issue #315782(opens in a new tab)
- Claude Code Issue #58094(opens in a new tab)
- Claude Code Issue #54536(opens in a new tab)
最后更新: 2026-05-12