Compare
Sorry, something went wrong.
No results found
perf(display): 锚点滚动 + 窗口裁剪 + 加载常数化——会话规模与资源占用解耦
长会话(15.8k 行)的加载/滚动/内存全面常数化:从"全量建显示 + 全量驻留"
改为"锚点定位 + 窗口驻留 + 双向按需回拉"。
滚动模型(锚点取代偏移):
- scroll_offset(距底部行数)→ (anchor_msg, anchor_row)(视口首行位置)
+ follow_tail(贴底跟随态);滚动不再依赖 total_lines(无需全量行数统计)
- 删除全部偏移补偿逻辑(流式追加/工具块重建/物化行数变化/思考展开):
视口上方/下方内容变化不影响锚点指向的内容——"滚动不跳变"成为结构性保证
- 绘制从锚点起向下,凑满视口即停(不再全量扫描消息)
窗口裁剪 + 双向回拉(消息结构体也常数化):
- trimWindow:以锚点为中心保留上下各 4 屏 + 500 条,超出部分连 Message
结构体一起丢弃;pullHistoryAbove/Below 在接近边界时按 db_id 回拉一批
- trimmed_above(下标→全局偏移)/ tail_has_more(尾部是否还有被裁历史)
- 底部钳制:锚点下方不足一屏时回拉或吸附跟随态(修复上滚再下滚露白)
加载常数化:
- loadSessionLazy 只读尾部 600 条元数据(不再全量读+建壳再裁);
上方条数用 COUNT(*) 记入 trimmed_above,滚动回拉时按需补
- 回拉到压缩摘要行时重建黄色标题(findCompactionBySummary)
清理:
- 删除死代码 scrollOffsetCompat / addLoadedToolDisplay / addLoadedToolCallNote /
atTail / preserveViewOnAppend / loadDisplayMeta(全量) 等,及 6 处无用行数计算
- display.zig 注释更新(disp_header 从未落库)
实测(真实 15.8k 行会话,ReleaseFast):
- 启动内存 16.9MB → 13.8MB;加载 ~200ms(保留区行 ~117ms + 历史重建 ~74ms
+ 显示构建 ~23ms,前三者均不随会话总规模增长);首帧 ~1ms
- 持续 PgUp 5 分钟 / 9367 次:内存 16.5 → 18.4MB(有界,不增长)
- 上滚到顶(4539 帧):数组始终 ~500 条(显示层内存 ~80KB,常数)
测试:178 pass(含"上滚后再下滚不越过内容末尾"回归测试)。
文档:architecture.md / development.md / AGENTS.md 已同步(含踩坑教训)。