工作空间与渲染管线
工作区与渲染管线
相关源文件
以下文件为本维基页面的生成提供了上下文:
crates/jcode-desktop/Cargo.tomlcrates/jcode-desktop/src/animation.rscrates/jcode-desktop/src/desktop_prefs.rscrates/jcode-desktop/src/main.rscrates/jcode-desktop/src/main_tests.rscrates/jcode-desktop/src/render_helpers.rscrates/jcode-desktop/src/session_launch.rscrates/jcode-desktop/src/single_session.rscrates/jcode-desktop/src/single_session_render.rscrates/jcode-desktop/src/workspace.rscrates/jcode-desktop/src/workspace_tests.rscrates/jcode-mobile-core/src/lib_tests.rscrates/jcode-mobile-core/src/protocol.rscrates/jcode-mobile-core/src/visual.rscrates/jcode-mobile-sim/src/lib_tests.rsdocs/DESKTOP_FIRST_PROTOTYPE.mdpackaging/linux/jcode-desktop.desktopsrc/stdin_detect.rs
jcode-desktop 应用程序是一个基于 wgpu 和 winit 构建的 GPU 加速原生客户端。它提供了一个高性能的空间界面,用于与智能体会话进行交互,并具备流畅的动画效果和自定义的基于顶点的 2D 渲染器。
DesktopApp 模式
DesktopApp 枚举(通过主事件循环和应用程序状态隐式管理)支持两种主要的视觉和操作模式:工作区和单会话。
- 工作区模式:一种受 Niri 启发的空间布局,多个会话以水平条带(车道)和垂直列的形式排列。该模式侧重于多智能体协调和高层次项目概览
crates/jcode-desktop/src/workspace.rs:177-180。 - 单会话模式:一个专注于单个会话的高保真聊天界面,通过
glyphon实现富文本渲染,并支持详细的消息格式化crates/jcode-desktop/src/single_session.rs:98-135。
布局与面板预设
工作区使用 PanelSizePreset 来确定屏幕上可以容纳多少列。布局会根据窗口大小和所选比例进行自适应调整 crates/jcode-desktop/src/workspace.rs:18-32。
| 预设 | 屏幕比例 | 可见列数(以 2000px 宽度为例) |
|---|---|---|
Quarter(四分之一) | 0.25 | 4 列 crates/jcode-desktop/src/main_tests.rs:12-12 |
Half(一半) | 0.50 | 2 列 crates/jcode-desktop/src/main_tests.rs:20-20 |
ThreeQuarter(四分之三) | 0.75 | 1 列 crates/jcode-desktop/src/main_tests.rs:21-21 |
Full(全屏) | 1.00 | 1 列 crates/jcode-desktop/src/main_tests.rs:22-22 |
来源: crates/jcode-desktop/src/workspace.rs:18-32, crates/jcode-desktop/src/main_tests.rs:5-26
wgpu 画布生命周期
该应用程序使用 wgpu 实现了一个自定义渲染管线。它避免了繁忙的渲染循环,而是采用按需事件循环,由用户输入或动画时钟触发 docs/DESKTOP_FIRST_PROTOTYPE.md:46-46。
渲染管线数据流
下图展示了从高层状态到 GPU 顶点的转换过程。
标题:状态到顶点管线
来源: crates/jcode-desktop/src/main.rs:128-133, crates/jcode-desktop/src/single_session_render.rs:75-169, crates/jcode-desktop/src/render_helpers.rs:23-91, docs/DESKTOP_FIRST_PROTOTYPE.md:40-47
基于顶点的 2D 渲染器
该渲染器完全基于顶点,将所有 UI 元素转换为三角形。这包括渐变、圆角和边框。
- 着色器:一个简单的 WGSL 着色器处理 2D 位置和 4 分量颜色。背景使用在屏幕上插值的四点渐变
crates/jcode-desktop/src/main.rs:135-138。 - 圆角矩形:通过基于
PANEL_RADIUS(8.0)和ROUNDED_CORNER_SEGMENTS(6)计算每个角的线段来生成crates/jcode-desktop/src/main.rs:57-59。 - 渐变:由
push_gradient_rect实现,该函数为四边形的每个顶点分配特定颜色crates/jcode-desktop/src/single_session_render.rs:87-100。
来源: crates/jcode-desktop/src/main.rs:57-59, crates/jcode-desktop/src/single_session_render.rs:87-100, crates/jcode-desktop/src/main.rs:135-138
字体与文本渲染
系统根据当前激活的模式使用两种不同的文本渲染策略。
位图字体(工作区)
对于高层工作区视图,使用自定义的 5x7 位图字体。该字体通过为字符字形中的每个活动位推送单个像素大小的四边形来渲染 crates/jcode-desktop/src/render_helpers.rs:191-228。
- 规范化:
normalize_bitmap_text将文本消毒为大写字母、数字和基本符号,以适配有限的位图字符集crates/jcode-desktop/src/render_helpers.rs:167-188。 - 换行:
wrap_bitmap_text根据提供的max_width对面板正文执行基于单词的换行crates/jcode-desktop/src/render_helpers.rs:120-152。
Glyphon 文本布局(单会话)
SingleSessionApp 使用 glyphon 库实现高质量的子像素文本渲染 crates/jcode-desktop/Cargo.toml:13-13。
- 排版:通过
SingleSessionTypography配置,目标字体为 "JetBrainsMono Nerd Font",字重为 "Light"crates/jcode-desktop/src/single_session.rs:13-21。 - Markdown 解析:消息使用
pulldown-cmark进行解析,并转换为包含代码、数学和强调等内联范围的SingleSessionStyledLine条目crates/jcode-desktop/src/single_session.rs:5-7,crates/jcode-desktop/src/single_session.rs:156-178。
来源: crates/jcode-desktop/src/render_helpers.rs:120-228, crates/jcode-desktop/src/single_session.rs:13-178
动画系统
平滑过渡由 animation 模块处理,使用三次缓动函数来防止 UI 元素出现突兀的"瞬移"。
动画视口
AnimatedViewport 管理相机的位置和缩放级别。它在 VIEWPORT_ANIMATION_DURATION 定义的时间段内,在 WorkspaceRenderLayout 状态之间进行插值 crates/jcode-desktop/src/main_tests.rs:62-110。
- 三次缓动:
scroll_offset、vertical_scroll_offset和column_width的过渡使用ease_out_cubic,以产生自然的减速效果crates/jcode-desktop/src/main_tests.rs:97-103,crates/jcode-desktop/src/main.rs:116-121。
焦点脉冲
当用户在面板之间切换焦点时,会触发 FocusPulse 动画。该动画通过在 FOCUS_PULSE_DURATION 内返回一个递减的脉冲值,短暂地高亮显示新聚焦面板的边框 crates/jcode-desktop/src/main_tests.rs:113-131。
标题:动画状态转换
来源: crates/jcode-desktop/src/main_tests.rs:62-131, crates/jcode-desktop/src/main.rs:116-121
布局逻辑
空间布局由 Surface 和 Workspace 结构体控制。
- 车道:垂直工作区索引(Niri 风格)。每个车道是一个水平的列条带
crates/jcode-desktop/src/workspace.rs:177-180。 - 列:车道内的水平位置。导航使用
h/l在列索引之间移动crates/jcode-desktop/src/workspace_tests.rs:5-18。 - 占位表面:如果用户导航到一个空车道,系统会生成一个标题为 "workspace {lane}" 的占位表面
crates/jcode-desktop/src/workspace_tests.rs:42-49。
来源: crates/jcode-desktop/src/workspace.rs:169-180, crates/jcode-desktop/src/workspace_tests.rs:5-49