ZH

 


终端也是一块画布

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 边更新,却几乎不闪、不卡。