终端也是一块画布
pi-tui 是 pi 的终端渲染引擎。终端不像浏览器有 DOM,它只是一格格字符。要在上面画出流畅的对话、可滚动的历史、弹窗和焦点切换,靠的是三件事:差分渲染、focus 管理、overlay。
差分渲染:只重画变了的部分
每帧都清屏重画会闪烁、会慢。pi-tui 维护一份「上一帧」的字符缓冲,新一帧算出来后只 diff 出变化的格子,仅把这些差异写进终端。流式输出时,这意味着每来一个 token 只更新末尾几格。
上一帧缓冲 ─┐
├─▶ diff ─▶ 只发生变化的单元格 ─▶ 写入终端
新一帧缓冲 ─┘ (而非整屏重绘)focus 与 overlay
- focus:决定键盘事件送给谁——输入框、历史列表,还是某个弹窗。Tab / 方向键在可聚焦组件间流转。
- overlay:在主界面之上盖一层——命令面板、确认框、模型选择器。它临时抢占 focus,关掉后焦点归还。
差分渲染的核心思路(精简)
function render(next: Cell[][]) {
for (let y = 0; y < next.length; y++)
for (let x = 0; x < next[y].length; x++)
if (!eq(prev[y][x], next[y][x])) {
moveCursor(x, y)
write(next[y][x]) // 只写变化的格子
}
prev = next
}正是差分渲染,让 pi 在终端里也能有「丝滑流式」的体验——边吐 token 边更新,却几乎不闪、不卡。