
Blender 的 UI 被拆成独立库 BUI,速度远超 GPUI
来源标题:Blender's UI and Runtime: Much Faster Than GPUI
开发者将 Blender 的界面抽离为独立 UI 库 BUI,提供小型 C 核心并支持 Python、Rust、JavaScript/React、C、C++ 和 Dear ImGui 调用。官方称其布局、输入与绘制均由原生代码在 CPU 或 GPU 上完成,速度远超 GPUI。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Blender 的用户界面,可以作为库从 Python、Rust、JavaScript/React、C、C++ 和 Dear ImGui 中使用。人们花了数十年时间构建和优化 Blender 的 GUI。它省电省内存,而且快得惊人。我们将它解耦出来,让每个人都有机会用它构建自己的产品。它支持多种语言和框架,所以你不会错过任何节拍!
网站和完整文档:bui.preetham.top 这份 README 是一本小书。从头读到尾了解整个故事,或者跳到你需要的章节。当有更多内容要讲时,每一章都会链接到 docs/ 或网站上的详细指南。
- BUI 是什么 BUI 取用 Blender 的用户界面(它的控件绘制、交互规则和外观),将其转变为一个带有小型 C 核心的独立 UI 库。你的代码构建控件树并处理回调。布局、输入、绘制和呈现全部在快速的原生代码中完成,运行在 CPU 或 GPU 上。 BUI 的核心是 kit:一个用 C 编写的小型运行时。kit 将所有控件保存在一棵树中,对它们进行布局,处理鼠标和键盘输入,并按照 Blender 的方式绘制它们。绘制代码是 Blender 自身控件代码的 C 移植版,交互遵循 Blender 的规则。在 kit 之上是绑定层:让 Python、Rust、JavaScript、C++ 和 Dear ImGui 与之通信的薄层。
Blender 的界面以手感闻名。你按住一个数字字段并拖动:光标消失,数值在你手下滑动,而且你永远不会碰到屏幕边缘。你在字段中输入 2*pi,它就能直接工作。你在菜单中输入 "ad cu",它就能找到 "Add Cube"。数百万艺术家已经把这些习惯刻进了骨子里。 那个界面也同样快速且节俭。它只重绘发生变化的部分,无事发生时进入休眠,启动只需毫秒。BUI 的存在就是为了让任何应用、任何语言都能同时拥有两者:Blender 的手感和 Blender 的效率。
你有一个 tkinter 应用,希望它看起来不那么像 1998 年。让它在 BUI 上运行,无需改动。 你在为已经熟悉 Blender 的艺术家构建工具。给他们双手期待的面板、滑块和快捷键。 你用 Rust 或 React 编写,想要一个原生桌面 UI 而不必附带浏览器。 你使用 Dear ImGui,希望它看起来和用起来都像 Blender,只需一个编译标志。 你好奇 UI 工具包是如何工作的。源码可读,概念用平实的语言解释。
- 多种接入方式 你可以用多种方式驱动 BUI,它们都共享同一个 C 运行时,所以都能获得相同的控件和交互: 不确定选哪个?如果你已经有代码,使用与它匹配的那一行。 如果你在 Python 中从零开始,Blender 组件是最友好的。
Blender 的控件和交互 用隐藏的连续光标拖动的数字字段:Shift 用于精确控制,Ctrl 用于吸附。 数字字段中的数学运算,使用 Blender 自己的表达式求值器:2*pi、min(4, 3)、round(1.7)、x if c else y。 Ctrl+Wheel 步进数值,Ctrl+C / Ctrl+V 复制数值,Backspace 重置。 在复选框上拖动以全部设置。 按下-拖动-释放菜单、饼图菜单,以及 Blender 的模糊菜单搜索:"ad cu" 找到 "Add Cube",拼写错误会被原谅,最近的选择排在前面。 每次 UI 编辑都支持 Ctrl+Z / Ctrl+Shift+Z,在文本字段中打字时也支持;Tab 在字段之间切换。 Blender 的浮点显示精度、多字段垂直拖动,以及带有 Blender 动画效果的折叠面板。 HSV 色轮、颜色渐变、曲线、树、列表、文本区域、画布、节点编辑器和 Blender 的文件浏览器。 Blender 的深色和浅色主题,可在运行时切换。
Python,四种方式 tkinter:tkinter 和 ttk 的全部 7,846 个公开名称。九个真实程序在标准库和 BUI 上行为完全一致。 Qt 语法:控件、布局、信号、QPainter、菜单和定时器。 组件:45 个 Blender 控件、编辑器和模板。 Dear ImGui:from blenderui import imgui,pyimgui 风格。 一次 pip install,没有 Qt 或 Tk 控件绘制任何东西。
Rust:Web 平台,原生运行 全部 113 个 HTML 元素,像浏览器那样绘制它们;styled 让任何子树获得 Blender 的外观,而 Blender 组件(<NumberSlider>、<Button>、<ColorSwatch> 等)是真正的 Blender 控件。 现代 CSS:flexbox、带命名区域的 grid、表格、calc() 和所有数学函数、var()、oklch() 和 color-mix()、:has()、嵌套、@layer、@media 范围、@container、::before/::after、计数器。 效果和动效:@keyframes 动画和过渡、滤镜、backdrop-filter、混合模式、clip-path、遮罩、2D 变换、border-image。 Tailwind CSS v4:class="md:hover:bg-sky-500/50" 或裸属性(<div p-4 bg-[#4772b3]>),带有 "did you mean" 编译错误提示。 rsx! / view! 类 HTML 标记、#[component],以及 zopra、React 或 Leptos 风格的 hooks(use_state、signal、Memo、Effect、context)。 也兼容 gpui 语法:div().flex().gap_2()、Render、cx.listener。 在 crates.io 上:cargo add blenderui。
设计上追求快速 损伤渲染:空闲 UI 消耗 0% CPU,悬停只重绘它触及的控件。 可选的 GPU 渲染器(Windows 上 Direct3D 11,Linux 上 OpenGL 3.3),仿照 Blender 的实例化控件绘制。它绘制的像素与 CPU 光栅相同。 在基准测试中,每帧 CPU 消耗比 gpui-fast 少 2–4 倍,RAM 更少,首帧约 5 毫秒。 Blender 的文本:Inter(Blender 的 UI 字体)已嵌入,并像 Blender 那样用 FreeType 渲染,所以文本在每个平台上看起来都一样。在 GPU 上,字形用 Slug 从轮廓绘制,回退到像 Blender 那样的逐字形图集。
JavaScript 和 React React 19.3 渲染到 BUI:HTML 宿主组件、CSS 和 Tailwind、事件、Suspense、过渡、actions,以及 Blender 组件(<NumberSlider>、<Button> 等)。BUI 在 CPU 或 GPU 上绘制它们;没有浏览器,也没有 webview。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。