Guide · 01 Setup
快速开始 (Getting Started)
配置 Rust 工具链,安装 gpux-cli,创建并运行你的第一个跨平台原生 GPU 应用。
1. 环境要求与系统依赖
GPUX 基于 Rust 2024 Edition (rustc 1.85+)。在开始前请确保已安装 Rust 工具链与对应系统的图形开发头文件:
| 操作系统 | 图形后端 | 系统依赖安装命令 |
|---|---|---|
| macOS 13+ | Metal + CoreText | xcode-select --install |
| Ubuntu / Debian | Vulkan (Wayland/X11) | sudo apt install libxcb1-dev libxkbcommon-dev libxkbcommon-x11-dev libwayland-dev libvulkan-dev |
| Arch Linux | Vulkan (Wayland/X11) | sudo pacman -S vulkan-icd-loader libxkbcommon wayland |
| Windows 10/11 | DirectX 12 | 安装 Visual Studio C++ Build Tools 与 Windows 11 SDK |
2. 使用 9 大生态命令一键安装或创建工程
GPUX 原生支持 Bash、PowerShell、Fish、Cargo 以及主流前端包管理器(npm、Yarn、pnpm、bun、deno)一键拉起脚手架:
curl -fsSL https://gpux.waya.ink/install.sh | bash
gpux init my-studio && cd my-studio && gpux dev
irm https://gpux.waya.ink/install.ps1 | iex
gpux init my-studio; cd my-studio; gpux dev
curl -fsSL https://gpux.waya.ink/install.fish | source
gpux init my-studio; and cd my-studio; and gpux dev
cargo install gpux-cli
gpux init my-studio && cd my-studio && gpux dev
npm create gpux@latest my-studio
cd my-studio && npm run dev
yarn create gpux my-studio
cd my-studio && yarn dev
pnpm create gpux my-studio
cd my-studio && pnpm dev
bun create gpux my-studio
cd my-studio && bun run dev
deno run -A npm:create-gpux@latest my-studio
cd my-studio && deno task dev
3. 诊断 8 端工具链并启动热重载
bash
# 诊断本地 Rust 与 8 端交叉编译工具链 (Desktop / iOS / Android / HarmonyOS / Web WASM)
gpux doctor
# 启动桌面或指定目标平台开发会话
gpux dev --target desktop
4. 生成的目录结构
text
my-studio/
├── gpux.json # 统一应用清单 (窗口尺寸、标识符、移动端 SafeArea 与 Web/小程序配置)
├── Cargo.toml # 依赖 gpux 统一 SDK
└── src/
└── main.rs # GPUI 视图与 ServiceRegistry 入口
5. 编写第一个 GPU 原生视图与强类型服务 (`src/main.rs`)
打开 src/main.rs,你无需编写任何 HTML/CSS 或过程宏,即可使用 gpux::prelude::* 与 gpui-kit 组件构建完整应用:
rust
use gpux::prelude::*;
use gpux::ui::component::button::{Button, ButtonVariants as _};
use gpux::ui::{ActiveTheme, Sizable as _, StyledExt as _};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Serialize, Deserialize)]
struct PingReq { node: String }
#[derive(Serialize, Deserialize)]
struct PingResp { latency_us: u64, backend: String }
struct StudioView {
services: Arc<ServiceRegistry>,
status: String,
}
impl Render for StudioView {
fn render(&mut self, _window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
let theme = cx.theme();
v_flex()
.size_full()
.p_6()
.gap_4()
.bg(theme.background)
.text_color(theme.foreground)
.child(div().text_xl().font_bold().child("GPUX Native Studio"))
.child(div().text_sm().text_color(theme.muted_foreground).child(self.status.clone()))
.child(
h_flex().gap_2().child(
Button::new("btn-ping")
.primary()
.small()
.label("调用强类型服务 (1.2µs)")
.on_click(cx.listener(|this, _, _, cx| {
if let Ok(res) = this.services.call::<PingReq, PingResp>(
"node.ping",
&PingReq { node: "edge-shanghai-01".into() },
) {
this.status = format!("Backend: {} ({} µs)", res.backend, res.latency_us);
cx.notify();
}
})),
),
)
}
}
fn main() -> anyhow::Result<()> {
let app = gpux::app("my-studio")
.title("GPUX Native Studio")
.window_size(1120, 720)
.bind("node.ping", |req: PingReq| -> anyhow::Result<PingResp> {
Ok(PingResp {
latency_us: 1,
backend: format!("{} · {:?}", req.node, Platform::current().render_backend()),
})
});
let services = app.services();
gpux::desktop::run_with_view(app, move |_window, cx| {
cx.new(|_| StudioView {
services: services.clone(),
status: "Ready · GPU Pipeline".into(),
})
})
}