
开发者将 Blender 界面抽离为独立 UI 库 BUI,支持多语言调用
来源标题:Blender's UI and Runtime: Much Faster Than GPUI
开发者把 Blender 的界面抽离成独立 UI 库 BUI,核心用 C 编写,可供 Python、Rust、JavaScript/React、C、C++ 和 Dear ImGui 调用。该库复用 Blender 打磨数十年的控件绘制与交互逻辑,布局、输入和绘制均由原生代码在 CPU 或 GPU 上完成,主打低功耗、低内存占用和高速度。
以下正文由 AI 翻译自 Hacker News(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Blender 的用户界面,可作为库供 Python、Rust、JavaScript/React、C、C++ 和 Dear ImGui 调用。人们花了数十年构建和优化 Blender 的 GUI。它省电省内存,而且快得离谱。我们把它解耦出来,让每个人都有机会用它构建自己的产品。它支持多种语言和框架,所以你什么都不用错过!
网站和完整文档:bui.preetham.top 这份 README 是一本小书。从头读到尾了解全貌,或跳到你需要的那一章。每一章都会在需要展开时链接到 docs/ 或网站上的更长指南。
-
BUI 是什么 BUI 取用 Blender 的用户界面(它的控件绘制、交互规则和外观),把它变成一个独立的 UI 库,核心用一小段 C 写成。你的代码负责构建控件树并处理回调。布局、输入、绘制和呈现全部由快速的原生代码完成,跑在 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+滚轮步进数值,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]>),带 “你是不是想写” 编译错误提示。 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 倍,内存更少,首帧约 5 ms。 Blender 的文本:内嵌 Inter(Blender 的 UI 字体),用 FreeType 按 Blender 的方式渲染,所以文本在每个平台上看起来都一样。在 GPU 上,字形用 Slug 从轮廓绘制,回退到像 Blender 那样的逐字形图集。 图像 所有语言共用一套 C 解码器:PNG、GIF、BMP、TGA、QOI(Wuffs,内存安全)、JPEG(libjpeg-turbo)、WebP 含动图(libwebp)、Radiance HDR、PNM 和 SVG。设计沿用 Blender 的 imbuf:一种图像类型加一张格式表。
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。