用途:当 TUI 绘制错误、闪烁、浪费 CPU、尺寸变化处理不当、污染回滚缓冲,或需要稳健渲染架构时使用。
渲染原则:从状态渲染,视图应是当前状态与终端尺寸的纯投影;批量写入,先构建一帧、做差异或队列更新后一次性刷新,避免大量小写入;减少终端控制抖动,重复样式重置、光标移动和整屏清除开销大且远程可见;对日志、指标、鼠标移动、尺寸风暴和进度更新等高频繁源做节流与合并;明确帧所有权,全屏渲染器在活动时拥有屏幕,后台输出另走他处。
布局规则:每帧或每次尺寸变化时根据宽高计算布局;设定最小可用尺寸,低于阈值时渲染清晰的小屏提示;优先使用约束、flex、grid、分栏或框架布局原语而非魔法坐标;将焦点、选择、视口偏移和光标位置保存在 UI 状态中;测试窄、宽、高、极小和奇数终端尺寸。
备用屏幕生命周期:全屏应用在退出后应返回原回滚缓冲时使用备用屏幕;简单输出、需保留命令结果时不要使用。清理必须恢复:备用屏幕、原始/cbreak 模式、鼠标跟踪、括号粘贴、焦点与扩展键盘模式、光标可见性与样式、若修改过则恢复终端标题或调色板。
性能清单:UI 循环不阻塞于网络、磁盘、子进程或 API 调用;长操作通过消息/通道/任务发布进度;渲染速率限制在人类有用感知范围,尤其仪表盘;尺寸事件在昂贵重算前合并;表格和列表对大数据集虚拟化或分页;TUI 拥有屏幕时日志不写 stdout/stderr;若支持远程终端,将 SSH 延迟纳入测试。
失败模式与修复:闪烁多因整屏清除或重复刷新,改为差异/批量写入、避免整屏清除;空闲高 CPU 多因无条件重绘循环,改为事件驱动或限速 tick;崩溃后 shell 损坏多因 panic/异常时缺少清理,改用集中式终端守卫并在 finally/defer/drop 中清理;布局重叠多因绝对坐标或过期尺寸,尺寸变化后重算约束;日志出现在 UI 内多因备用屏幕活动时写 stdout/stderr,改用文件输出、应用内日志面板或缓冲日志。
参考文件:references/render-loop-patterns.md 涉及帧缓冲、脏区域、节流和事件循环;references/alternate-screen-lifecycle.md 涉及设置/清理清单与崩溃恢复。