Files
pebrel/ROADMAP.md
T

6.2 KiB
Raw Blame History

Nebula UI 终局路线图

定案时间:2026-08-13。本文件是唯一的长期计划权威;阶段推进、闸门结果、 裁定变更都回写到这里。

终局形态(不可协商的三条)

  1. 唯一产品、唯一代码库:nebula.exe(nebula_app)。GPUI 最终作为 nebula_app 体内的 UI 层接入——不是第二个产品 exe。nebula_gpui crate 永远只是实验场:快速验证组件、交互与渲染方案;验证通过的模块并入 nebula_app,产品代码不在实验场安家。
  2. 网格渲染永远自有:nebula_terminal 引擎 + 渲染合同 (render.rs / render/boxdraw.rs)+ 终端 Element。终端内容只存在 "单元格网格"一种形态,排版引擎(任何字体系统)无权移动网格字形。 powerline、fastfetch、TUI 边框、CJK 对齐是验收闸门,不是愿望。
  3. 回滚 = 代码保留 + git 历史:旧 winit/OpenGL UI 保留在树上、保持可 构建,直到闸门全过 + 稳定期结束;删除旧 UI 是迁移的最后一步。不设 运行时开关、不留长期 feature flag 双路径。

三道闸门(任一否决即停在原地)

闸门 内容 验收方式
G1 性能 大流量吞吐与滚动流畅度不低于旧渲染器既定比例(首测后定阈值) scripts/perf_baseline.ps1 可重复测量,新旧同负载对比
G2 IME 中文输入全链路:预编辑、候选窗跟随光标、提交、退格 人工清单(用户亲手验收)
G3 视觉保真 powerline 提示符、fastfetch(logo/色块/宽字符)、boxdraw 边框、CJK 对齐、光标形态 新旧并排截图对账

阶段

P0 地基(已完成)

  • workspace 合并(120859b):crossfont 0.9 解除 links 冲突,单 lockfile。
  • 渲染合同(73c584a、d049894):viewport 合流 + 纯数据快照,引擎零框架类型。
  • boxdraw 几何(5c6745d):框线/块/Powerline 收归合同,字体无权染指。
  • 终端 Element + 多 tab 工作区(5815b95、05ab821):真 ConPTY 在 GPUI 内跑通。
  • lib+bin 双形态与进程内拉起验证(f315edc):双 UI 运行时同进程共存已证实。
  • 注:2026-08-13 全库改写剔除联合作者尾注,本节哈希已同步为新值。

P1 闸门建设(当前)

  • 1a 性能基线:scripts/perf_baseline.ps1(负载生成 + ConPTY 免焦点 注入 perf_inject.ps1 + 终端内自计时)。 首测 2026-08-13(50MB 混合负载:ANSI 256/真彩 + CJK + boxdraw + Powerline),release 构建,各 3 轮取中位:

    壳 中位耗时 吞吐 内存 窗口
    winit-old 21.1s 2.4 MB/s 118 MB 1267x740
    gpui-lab 21.8s 2.3 MB/s 85 MB 1095x729

    判读:吞吐差 3.6%(GPUI 窗口略小,按面积校正视为持平),内存省 28%。 G1 阈值定为:等网格下吞吐不低于旧壳的 90%——当前通过。后续在等 网格条件下复测一次收严。

    测量中抓到的真 bug(引擎级):无侧载 OpenConsole/conpty.dll 对时走 系统 conhost 回退,大流量下会话完全停摆(PTY 缓冲写满、相关进程 全部 0% CPU)。旧壳发行版始终带侧载对所以从未暴露。修复列入 P2; 运维规则:任何 nebula 系 exe 旁必须部署侧载对。

  • 1b IME 清单:输出一页人工验收清单,等用户有空亲手敲。

  • 1c 视觉对账集:scripts/visual_parity.ps1——固定样张(boxdraw 全家 桶、块/浓度/象限、Powerline 分隔符、CJK 对齐标尺、256 色/真彩)注入 两壳并截图(.tmp_parity_<tag>.png)。 首轮对账 2026-08-13:结构级持平——框线闭合无缝、CJK 标尺逐列对 齐、Powerline 三角在 GPUI 侧(boxdraw 几何)边缘更干净;mixed/half/ trans 几行两壳同样偏怪(旧壳像素栅格化的既有观感,非回归)。 待办:config 共享后做同主题对比;fastfetch 未安装(装上即可入集); 放大级笔画粗细对账。

P2 实验场补齐终端体验(在 nebula_gpui 快速迭代)

迁入前必须在实验场达到"日用无感":

  • 选择/复制细节对齐旧壳(双击选词、行选、复制行为)。
  • 滚动细节:翻页快捷键、回滚缓冲行为、滚动条(如旧壳有)。
  • 分屏:先把分屏规则抽成共享 SplitTree(纯数据 + 单测),再接 GPUI 面板。
  • config 共享化:还掉实验场里复制 config 解析的债——共享 crate,一份 nebula.toml 两壳同读。
  • 会话/SSH 逻辑共享化评估(能抽则抽,抽不动的记录原因)。
  • conhost 回退路径的大流量停摆修复(P1-1a 抓到,见上)。

P3 接入 nebula_app(GPUI 成为产品 UI 层)

  • GPUI 窗口成为 nebula.exe 的主窗(进程内,主线程或专用线程按 spike 结论)。
  • 验证过的 view/element 模块物理移入 nebula_app(如 nebula_app/src/ui/),nebula_gpui 只留 scratch 实验代码。
  • 产品面在 nebula_app 内直接用组件库实现:设置原生内嵌侧栏 pane、 启动器/命令面板、SSH 管理、标题栏/Acrylic 对齐。
  • 三闸门在接入形态下复测(实验场数字不能替代产品形态数字)。

P4 清场与重构(GPUI 接入完成后)

  • 稳定期(≥2 周日用)后删除旧 winit/OpenGL UI 与 gpui-shell 脚手架。
  • 大文件拆分分层(用户裁定,接入完成后统一做一次):
    • display/mod.rs(10342 行)→ 按面拆:终端视图、布局、消息条、弹层等。
    • display/settings.rs(7264 行)→ 设置分组模块化。
    • event.rs(3178 行)/ window_context.rs(3100 行)→ 输入/窗口分层。
    • 拆分原则:先划模块边界再搬代码,行为零变化,每步独立 commit 可回退。
  • crossfont 退场评估(旧渲染器删除后它应随之离开依赖图)。

纪律(引用 nebula_gpui/ARCHITECTURE.md)

  • 功能只写一次,进共享 crate;两壳都只写薄视图。
  • 直接采用:GPUI 赢下某个面后就是该面的唯一实现。
  • 引擎与渲染合同禁止出现 UI 框架类型(Cargo 依赖方向物理执行)。
  • fork 只允许组件级小行为补丁,平台窗口层不碰。