本文翻译自 gpui: Remove blade, reimplement linux renderer with wgpu,原载于 GitHub。
背景
Zed 是一款由 Zed Industries 开发的高性能代码编辑器,以其极快的启动速度和流畅的编辑体验著称。Zed 使用自研的 GPUI 框架来处理图形渲染,而 GPUI 在 Linux 平台上一直使用 Blade 图形库作为底层渲染器。
然而,Blade 图形库存在诸多问题,不仅影响 Zed 用户的使用体验,也影响了其他使用 GPUI 的第三方应用。社区贡献者 zortax 发起了这个 PR,将 Linux 平台的渲染器从 Blade 迁移到 wgpu。
为什么要切换到 wgpu?
wgpu 是 Rust 生态系统中事实上的图形标准,被众多重要项目采用:
- Bevy 游戏引擎 - Rust 最流行的游戏引擎
- Iced - 跨平台 GUI 库
- 其他几乎所有相关的 Rust 图形项目
这意味着:
- 更好的维护性 - wgpu 由社区积极维护,问题修复及时
- 生态红利 - 可以从其他项目的贡献中受益
- 更广泛的兼容性 - 支持多种后端(Vulkan、DirectX 12、Metal、WebGPU)
相比之下,Blade 被其作者描述为”实验性的,不适合生产环境使用”,且存在长期未合并的 PR,影响下游应用的正常使用。
解决的问题
这个 PR 解决了多个长期困扰 Linux 用户的问题:
- NVIDIA 显卡冻结问题 - 在使用 NVIDIA 显卡的 Smithay-based Wayland 合成器(如 niri)上,Zed 窗口会冻结
- 设置窗口无法点击 - 某些发行版上的交互问题
- XWayland 兼容性 - 改善了在 XWayland 环境下的表现
性能对比
在 PR 的讨论中,开发者进行了详细的性能测试:
内存使用
- 新的 wgpu 实现内存使用比 Zed Stable 更低
- VRAM 使用与 Blade 实现相当或更优
CPU 时间
- 经过优化后,CPU 绘制时间减少约 20%
- GPU 时间基本持平
# 优化前 (b64007c)
frames 5400-5519: CPU draw median=301.45µs, GPU median=12.328ms
# 优化后 (f988a34)
frames 1320-1439: CPU draw median=238.82µs, GPU median=12.303ms
关于跨平台支持的讨论
PR 中也讨论了是否应该在 macOS 和 Windows 上也使用 wgpu:
支持 wgpu 的观点:
- wgpu 支持多种后端(Vulkan、DirectX 12、ANGLE)
- 可能实现更广泛的设备兼容性
- 理论上可以实现 Web 版本
保持原生渲染器的观点:
- 原生渲染器(macOS 的 Metal、Windows 的 DirectX 11)性能更好
- wgpu 在空窗口时内存占用较高(约 100MB vs 10MB)
- 原生 API 有特殊优化路径
最终,Zed 团队决定仅在 Linux 上使用 wgpu,保持其他平台的原生实现。
技术亮点
在合并过程中,Zed 团队的 reflectronic 进行了多项优化:
- 单缓冲区复用 - 所有帧使用同一个缓冲区对象
- 预创建绑定组 - 减少 GPU 状态切换开销
- 简化全局变量处理 - 减少数据复制
- MSAA 采样优化 - 简化多重采样抗锯齿逻辑
启示
这个 PR 给我们带来几点思考:
- 依赖选择很重要 - 选择社区活跃、维护良好的依赖库可以避免很多问题
- 性能需要实测 - 很多人担心 wgpu 性能不如原生 API,但实际测试表明优化后的表现很好
- 渐进式迁移 - 可以先在一个平台上验证新方案,再考虑推广到其他平台
- 社区协作的价值 - wgpu 作为多个项目的共同依赖,任何改进都会惠及整个生态
总结
Zed 将 Linux 渲染器从 Blade 迁移到 wgpu 是一个明智的决定。它不仅解决了用户长期抱怨的冻结问题,还让项目与 Rust 图形生态更好地融合。对于那些在 Linux 上使用 NVIDIA 显卡或 Wayland 合成器的开发者来说,这是个好消息。
这个 PR 已于 2026 年 2 月 13 日合并到 Zed 的 main 分支,预计很快就会在正式版本中发布。