Rust 的 GUI 生态一直是个热闹的话题。从早期的 egui、iced,到 Dioxus、Slint,各家在自绘、原生渲染、Web 技术栈之间走不同的路线。最近注意到三个较新的框架——WaterUIBlincPly——它们都在尝试用 Rust 写一套代码,跑在移动端、桌面端甚至 Web 上。本文简单梳理它们的特点和差异。

三条路线的简要定位

框架渲染方式API 风格核心依赖
WaterUI原生控件渲染SwiftUI 式声明式平台原生 UIKit/Android View/GTK4
BlincGPU 自绘SwiftUI 式声明式wgpu + Taffy
PlyGPU 自绘Builder 链式macroquad/miniquad

简单说:WaterUI 像 React Native,走原生桥接;Blinc 像 Flutter,走 GPU 统一自绘;Ply 更像游戏 UI 框架,基于 macroquad 快速搭建界面。

WaterUI:原生渲染的 SwiftUI 追随者

WaterUI 的野心很明确:让 Rust 写出类似 SwiftUI 的代码,然后翻译成各平台的原生控件。iOS 和 macOS 上走 UIKit/AppKit,Android 上用 Android View,Linux 用 GTK4,同时还有一个 Web 后端。

它的响应式系统基于 nami crate,采用细粒度依赖追踪,没有虚拟 DOM。这让它在状态更新时可以直接定位到具体控件,避免整树刷新。框架本身也支持 no-std,对嵌入式场景留了余地。

use waterui::prelude::*;

fn main() -> impl View {
    vstack((
        text("Hello, WaterUI!").size(24.0).bold(),
        text("Build native UIs with Rust"),
    ))
    .spacing(12.0)
    .padding()
}

WaterUI 提供了 CLI 工具,支持热重载(water preview),对开发体验有加分。不过项目还在早期阶段,API 稳定性需要关注。

适合谁:想要真正原生外观和交互、熟悉 SwiftUI 范式、愿意接受早期项目的开发者。

Blinc:wgpu 上的自绘方案

Blinc 选择了另一条路——全部自己画。它基于 wgpu 做 GPU 加速渲染,布局由 Taffy(一个 Rust 实现的 Flexbox 引擎)负责。这种架构的好处是视觉表现完全由框架控制,可以实现毛玻璃、金属质感、阴影等复杂效果,而不受平台控件能力限制。

div()
    .glass()
    .rounded(16.0)
    .p(24.0)
    .child(text("Frosted Glass"))

Blinc 的动画系统值得一提:它使用弹簧物理(spring physics)而非固定时长,动画手感更自然。组件可以通过 #[derive(BlincComponent)] 生成类型安全的动画钩子,编译期就能检查动画属性的合法性。

平台覆盖也很全:macOS、Windows、Linux、Android、iOS 和 Web(WASM + WebGPU)。不过 WebGPU 在部分浏览器和旧设备上的支持度仍是需要注意的点。

适合谁:需要统一视觉风格、追求复杂动画和特效、对 GPU 渲染有掌控欲的项目。

Ply:macroquad 上的轻量 UI 层

Ply 的定位比前两者更轻量。它直接建立在 macroquad/miniquad 之上,这是一个在 Rust 游戏开发社区广泛使用的轻量级跨平台渲染库。Ply 提供的不是一套完整的视觉系统,而是一个用于快速构建 UI 的 element tree 和布局引擎。

ui.element()
    .width(grow!()).height(grow!())
    .layout(|l| l.align(CenterX, CenterY))
    .children(|ui| {
        ui.text("Hello, Ply!", |t| t
            .font_size(32)
            .color(0xFFFFFF)
        );
    });

Ply 使用 Builder 模式而非声明式宏,API 风格更偏向程序化 UI。它的 CLI 工具 plyx 能快速脚手架项目,并内置了 Google Fonts 选择、shader 管线、TinyVG 矢量图等可选功能。许可证是 Zero-Clause BSD,极其宽松。

适合谁:已经在用 macroquad 做游戏或工具、需要快速叠加 UI 层、喜欢 builder 风格的开发者。

怎么选

  • 要原生感、跟系统走 → WaterUI。它的原生渲染意味着无障碍、输入法、系统主题等都能自动继承平台行为,代价是各平台表现可能不完全一致。
  • 要统一视觉、重动画特效 → Blinc。wgpu 自绘给了你完全的控制权,代价是包体积和 WebGPU 兼容性。
  • 要轻量、快速上手、偏游戏/工具 → Ply。macroquad 的成熟生态和极简许可证降低了准入门槛,代价是它更像 UI 层而非完整应用框架。

三款框架都处于快速迭代期,目前看来 WaterUI 和 Blinc 偏向"应用级 UI 框架",Ply 偏向"游戏/工具 UI 层"。Rust GUI 生态还没有出现一家独大的局面,这种百花齐放的状态反而给了开发者按场景选择的空间。

Sources: