☰
Graphite 2023 年终回顾:Graphene 统一节点图引擎的完整迁移与 Alpha 3 展望
2026/10/1 18:41:49 网站建设 项目流程

Graphite 2023 年终回顾:Graphene 统一节点图引擎的完整迁移与 Alpha 3 展望

【免费下载链接】GraphiteCommunity-built comprehensive 2D content creation appplication for graphic design, digital art, and interactive real-time motion graphics powered by a node-based procedural graphics engine项目地址: https://gitcode.com/GitHub_Trending/gr/Graphite

从 2023 年初的 Alpha 2 发布系列,到 12 月中旬部署的“统一文档节点图”稳定版,Graphite 在过去一年里完成了一次对核心架构影响深远的重写:将传统图层系统逐步迁移到名为 Graphene 的节点图引擎之上。本文以官方博客《Looking back on 2023 and what's next》为主线,结合仓库中node-graph/graph-craft、node-graph/interpreted-executor、demo-artwork等模块的源码实现,还原这次迁移的三个阶段、底层数据结构与编译流程,并整理 2024 年(Alpha 3 系列)的技术路线图。

Alpha 2 发布系列:以节点图集成为年度主题

2023 年 2 月,Graphite 在 Alpha 预览版旗帜下进入第二个年头,并正式宣布开启Alpha 2 发布系列,将这一年的工作重心定为将节点图(node graph)深度集成进文档体系。到年底,这一目标已经实现——次年 2 月预计开启的 Alpha 3 系列将把重点转向程序化艺术工作流(procedural art workflows),对应功能页路线图中标注的“Alpha 3: Procedural vector editing and usability”(程序化矢量编辑与易用性)。

2023 年度开发进展回顾

博客按功能维度总结了这一年(在重构之余)实际落地的新特性,这些特性大多都能在当前仓库中找到对应实现:

  • Graphene 节点基础设施持续演进:显著升级了节点图的处理能力、性能与前端可用性,核心代码位于 node-graph/graph-craft(文档节点图的数据结构与编译器)与 node-graph/interpreted-executor(解释执行器)。
  • 新增大量实用节点:包括 Vibrance 等复杂色彩调整节点、Copy to Points 等程序化构建块、以及噪声图案生成器。节点注册表定义在 node_registry.rs,其中的node_registry()函数把每个ProtoNodeIdentifier映射到对应的NodeConstructor;ranked_value_types!宏则集中声明了BlendMode、StrokeJoin、GradientForm、BooleanOperation、NoiseType等一批可作为节点参数的枚举与值类型。
  • Brush 笔刷工具:用于绘制基于栅格的基础草图,对应 brush_tool.rs。
  • Pen 与 Path 工具的可用性改进:包括锚点选择、微移/变换以及精确数值位置输入,对应 pen_tool.rs 与 path_tool.rs。
  • 可拖拽的数字输入框与数学表达式求值:UI 中的数字输入框可以直接拖拽更新数值,并自动求值数学表达式。例如在末尾输入*2即可将数值翻倍,用sqrt(...)包裹即可开平方。
  • 一键打开预置示例作品:受 Blender 团队建议启发,加入了快速打开示例文档的入口,帮助新用户立刻看到 Graphite 的实际效果,而不是面对空白画布。仓库中的示例作品保存在 demo-artwork 目录,例如procedural-string-lights.graphite、valley-of-spires.graphite、marbled-mandelbrot.graphite等。

核心篇章:Graphene 节点图的分阶段集成

将节点图集成进文档是全年的主线任务。当时编辑器基于一套“有意为之的临时图层系统”,支持文件夹、矢量形状、文本、位图图像与动态图像生成等图层类型。为了实现“每个文档一张统一节点图,所有内容(图层、文件夹、画板)都生活在这张图中”的长期愿景,团队采取了分阶段、增量式的迁移路径,保证其他功能开发不会因为编辑器被整体破坏而停摆。

第一阶段(至 4 月):新增“图驱动图层”

首先在既有图层体系中新增一种携带 Graphene 节点图实例的特殊图层类型,并让它逐步取代其他类型。随后开始漫长的“移植”工作:把其余所有 legacy 图层类型、以及作用于它们的视口工具,逐一改写成节点。

以文本为例:原本的“文本图层类型”变成了由 Text 工具管理的Text 节点。也就是说,用户每次用工具在画布上创建文本,编辑器在幕后都会向节点图里写入一个 Text 节点及其参数。这一阶段在 4 月前完成。

第二阶段(至 8 月):文档级节点图与画板节点

此时只剩文件夹和图驱动图层,但它们(以及作为另一套临时系统的画板 artboards)仍然彼此隔离——不同图层的节点图之间无法互相连接,做不出真正的程序化设计。

因此第二阶段先在文档本身(而不是某个图层)上挂载一个新的节点图实例,随后:

  1. 用文档图中的Artboard 节点替换旧画板系统,为页面提供白色背景;
  2. 构建一种活在节点图内部的“图层”:它既是艺术作品节点的容器,又是容纳其他图层的文件夹,承担组织结构职责。

到 8 月,用户已经可以手动编辑文档图,但视口工具、文件夹层级、渲染管线等大量系统仍在沿用 legacy 图层。

第三阶段(10 月~12 月):一次性切换并清除回归

前两个阶段都是增量的,但第三阶段必须整体同时发生:把每一个视口工具都移植为操作统一文档图而非旧图层图。团队在独立开发分支上维护了数月,持续同步最新编辑器代码,直到破坏面降到可接受水平后,于 10 月合入主分支,随后逐个修复了 62 个遗留问题与回归项,最终在12 月中旬部署了搭载统一节点图的稳定版。

博客还提到,随后的圣诞节假期里作者清理了超过 6000 行无用代码,把项目 Rust 总代码行数压回 5 万行以内——与一年前相当,却承载了整整一年的新功能。

统一文档图在源码中的落地

迁移完成的成果——一个文档一张图——在当前仓库中可以直接通过数据结构验证:

  • NodeNetwork(见 document.rs)描述一个节点子图,包含exports(本网络对外导出的输出,每个输出要么引用网络内的某个节点输出,要么是常量值)、nodes(NodeId → DocumentNode的映射)与scope_injections(网络可暴露给子节点引用的常量)。
  • DocumentNode(document.rs)是节点图中的一个节点实例,其inputs支持NodeInput的多种形态:来自同图其他节点的连线NodeInput::Node、编译期固化不可变的硬编码值NodeInput::Value、从父网络“导入”的输入NodeInput::Import、从父作用域提取的NodeInput::Scope、以及仅供 GPU 编译期使用的内联 Rust 代码NodeInput::Inline。
  • DocumentNodeImplementation则决定节点的实现方式:既可以是一个嵌套的NodeNetwork子图,也可以是直接指向节点注册表的ProtoNode标识符,或是用于元编程的Extract标记(其典型用途是把某个子图的“源码形式”交给 GPU 编译器生成计算着色器)。
  • 编译入口Compiler::compile(见 graphene_compiler.rs)展示了从文档图到可执行 proto 网络的完整流水线:resolve_scope_inputs(解析作用域引用)→generate_node_paths(记录每个节点的原始位置路径)→populate_dependants(建立依赖关系)→ 对每个节点执行flatten(把嵌套网络展开到父图中,隐藏节点替换为 passthrough)→into_proto_networks→ 插入上下文清空节点并生成稳定的节点 ID。

实战案例:procedural-string-lights 示例作品

博客在开头放出的节日彩灯动画正是“节点图新功能”的直接产物,其源文件就保存在仓库的 demo-artwork/procedural-string-lights.graphite 中。打开这份 JSON 文档可以看到一张统一文档图的完整形态:根网络是一个 Artboard 节点,其内容由一系列“图层(Layer)”节点(内部是 Merge 子图)组成。

从文档的网络接口可以看出这张图的程序化构造方式(以下节点均可在该文件中找到对应的ProtoNode标识符与参数):

  • Star(星形生成器):vector_nodes::generator_nodes::StarNode以 5 个角、两个半径参数生成星形矢量。
  • Spline / Path:core_types::vector::SplineNode与vector_nodes::vector_modification_nodes::PathModifyNode组合出灯串的导线路径;文档中“Wire”图层明确标注“Use Path Tool to Reshape This!”,即用 Path 工具拖动导线锚点即可重塑整串灯的形状。
  • Sample Polyline:core_types::vector::SamplePolylineNode按 105 的分隔距离对路径采样,得到一串灯位点。
  • Copy to Points:core_types::vector::CopyToPointsNode把“灯泡”(Bulb Shape 等图形)复制到每个采样点,并通过 Random Scale Min/Max、Random Rotation、Seed 等参数实现随机尺寸与随机角度的分布。
  • Fill / Stroke / Assign Colors:graphene_core::vector::FillNode、graphene_core::vector::StrokeNode、graphene_core::vector::AssignColorsNode负责给灯珠上色(Assign Colors 从三色渐变中按梯度为每个灯珠取色)与描边。
  • Transform:transform_nodes::transform_nodes::TransformNode为每个实例应用平移、旋转、缩放,构成整串灯的布局。

也就是说,整棵圣诞树与彩灯串不是手绘的像素,而是由节点参数驱动的程序化矢量数据——修改 Star 的角数、调整 Copy to Points 的随机种子或拖动导线锚点,画面就会实时重新计算。这正是博客中“让用户设计程序化生成的矢量艺术”这一目标的可运行范例。

2024 展望:Alpha 3 与硬件的接力

博客最后列出了 2024 年的高层面目标(社区规模、日活用户、组织可持续性等)与纯开发维度的目标,后者与仓库现状可以相互印证:

  • 恢复重构期间移除的功能:包括吸附(snapping)、文件夹包围盒、变换轴心(transform pivots)与矢量形状布尔运算。
  • GPU 渲染默认化:计划引入 Vello 作为生产级硬件加速合成系统,统一当前分离的栅格与矢量管线,把实验性合成推进为默认渲染方式。
  • 新的矢量数据格式:设计适合高级程序化编辑与渲染的矢量图形数据格式,并配套程序化工作流特性。
  • 重做 Brush 工具:结合 GPU 加速管线与自适应分辨率系统,让数字绘画变得实用。
  • Mask Mode:为 Magic Wand 工具的选框选区实现蒙版模式,显著提升栅格编辑能力。
  • 动画能力(当年度的潜在延伸目标)。

这些目标与功能页路线图中“Alpha 3: Procedural vector editing and usability”的定位一致,也延续了博客“Alpha 2 以集成节点图、Alpha 3 以程序化编辑为主题”的发布节奏。

结语

2023 年对 Graphite 而言是“退一步、进两步”的一年:大量的时间用于用 Graphene 替代短期占位代码,但最终换来了其他矢量编辑器尚未具备的能力——基于节点图的程序化矢量编辑工作流。统一文档节点图完成后,后续的矢量/栅格编辑新功能都拥有了统一的地基。如果你希望亲自上手体验这套引擎,可以打开 demo-artwork 中的任一.graphite文档研究其图结构,或跟随博客同期发布的入门教程系列,用 Path 工具直接拖动彩灯导线的锚点,观察节点图参数如何驱动画面实时重绘。

【免费下载链接】GraphiteCommunity-built comprehensive 2D content creation appplication for graphic design, digital art, and interactive real-time motion graphics powered by a node-based procedural graphics engine项目地址: https://gitcode.com/GitHub_Trending/gr/Graphite

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询