Bromure 5 让浏览器用上 GPU
Bromure Web 在一台没有 GPU 的 Linux VM 里运行 Chromium,所以每一帧 WebGL 画面、每一个合成图层都由 CPU 绘制。在 macOS 27 上,Bromure 5 为每台浏览器 VM 提供一块以 Metal 为后端的 GPU。在三项 WebGL 工作负载上,批次时间的中位数从 170、965 和 3,555 ms 降到 21、32 和 68 ms:在这几项工作负载上,完成一个批次所需的时间比同一台 Mac 上的原生 Chrome 长 7% 到 61%。
浏览器厂商用数字来推销速度。Apple 的 Safari 页面称 Safari 是“世界上最快的 浏览器”,并根据 Apple 2026 年 8 月的测试,声称在 MotionMark 中 Safari 的渲染速度是 macOS 上 Chrome 的 5.3x。MotionMark 是一个“专注于图形 性能”的基准测试。Google 报告 Speedometer 成绩“自 2024 年 8 月以来提升了 22%”,并估计这 为每天浏览 10 分钟的用户节省了 1.16 亿小时的等待时间。2026 年 6 月,它又公布了 JetStream 469 分、Speedometer 61 分的 创纪录成绩。 Microsoft 表示,从 134 版起,“按 Speedometer 3.0 基准测试衡量,Microsoft Edge 最多快 9%”。 Blink、Gecko 和 WebKit 背后的团队共同打造了 Speedometer 3.0。
你会拿 Bromure Web 和这些浏览器比较,所以它必须跟得上它们。
没有 GPU 的浏览器
Bromure Web 在你 Mac 上一台可丢弃的 Linux VM 里运行 Chromium。在 Bromure 5 之前, 这台 VM 没有 GPU。
Apple 的 ParavirtualizedGraphics 框架“为在虚拟机中运行的 macOS 实现硬件加速
图形”,
这是 macOS 客户机的受支持路径。对于 Linux 客户机,Virtualization 框架提供一个
Virtio 图形
设备,
你只需为它配置显示尺寸。在我们的 VM 里,它给了 Chromium 一块屏幕,却没有 3D 加速,
于是 Chromium 退回到 Mesa 的 llvmpipe(在 CPU 上运行 OpenGL),并关闭了 GPU 合成。
页面画出的像素是对的,但地图、canvas 图表、3D 查看器和设计工具都慢得像在爬。
Bromure 5 如何加上 GPU
macOS 27 允许应用通过 VZCustomVirtioDeviceConfiguration 实现自己的 Virtio 设备。
Bromure 5 用它呈现一块标准的 Virtio GPU(设备类型 16),因此客户机不需要定制的内核
驱动。它使用 Ubuntu 24.04 和自带的 virtio_gpu 内核模块;兼容的浏览器镜像还包含
锁定版本并打过补丁的用户态 Mesa,以及浏览器视频集成。
现在,一帧 WebGL 画面走的是这条路径:
- Chromium 通过 ANGLE 绘制到 Mesa 的 VirGL 驱动上。
- VirGL 通过 Virtio GPU 队列发送 OpenGL 命令。
- Mac 上的一个渲染器工作进程通过基于 Metal 的 ANGLE 重放这些命令。
- 浏览器窗口以 IOSurface 的形式显示完成的帧。
- 每台 VM 一个渲染器。 每台浏览器 VM 都有自己的沙箱化渲染器进程。在测试中, 两个工作进程重用了相同的标识符,仍各自保有独立的表面,并且第一个关闭后,第二个 仍在继续运行。
- 原生光标。 macOS 根据客户机发送的光标图像绘制指针。
- 硬件解码 H.264。 Bromure 把客户机的视频解码器桥接到 VideoToolbox。Chromium 仍以软件解码 AV1。
- 只做图形。 这个设备负责渲染和视频解码,不提供通用 GPU 计算,所以 VM 里的代码 无法在你的 GPU 上运行机器学习工作负载。
数据
我们在一台 Mac 上用三种方式运行同一项 WebGL 工作负载:在 Bromure VM 里使用新渲染器
的 Chrome,在同一台 VM 里使用 Apple 图形设备(因而走 llvmpipe)的 Chrome,以及
macOS 上的 Chrome。
| 工作负载 | Bromure VM,Metal 渲染器 | 同一台 VM,Apple VZ 图形(软件) | macOS 上的原生 Chrome |
|---|---|---|---|
| 2,048 次绘制,64 × 64 | 20.8 ms | 169.5 ms | 12.9 ms |
| 64 次绘制,1,280 × 720,32 次着色器迭代 | 32.2 ms | 965.2 ms | 22.8 ms |
| 24 次绘制,1,920 × 1,080,128 次着色器迭代 | 68.2 ms | 3,555.1 ms | 63.9 ms |
每个数字都是五次试验的中位数,衡量的是完成一批 GPU 工作所需的挂钟时间。数值越低越好。

与软件渲染相比,新路径分别快了 8.1x、30.0x 和 52.1x,像素工作量越大,差距越大。 与原生 Chrome 相比,VM 所需的时间分别是它的 1.61x、1.41x 和 1.07x。大量小型绘制调用 的开销最大,而在最重的着色器上,VM 与原生的差距在 7% 以内。
测试环境:Bromure 5.0.1,Apple M5 Pro,18 个 CPU 核心,64 GB 内存,运行 macOS 27.0.1。 VM 运行 Ubuntu 24.04 ARM64,Mesa 25.2.8,9 个 vCPU,4 GB 内存。三条路径都使用 Chrome 154.0.8037.57。每个样本都先预热,最后以一次单像素回读收尾,强制 GPU 完成工作, 所以计时涵盖浏览器、驱动和回读,不包括着色器编译。
把帧送上屏幕
在 flush 时发布。 Virtio GPU 客户机先指定扫描输出资源,等内容就绪后再 flush。我们 的第一个版本在扫描输出时就发布,可能会显示一个画了一半的表面。Bromure 现在在 flush 时 更新窗口。
调整大小期间的有限保持。 在新尺寸下,页面重绘之前的第一帧常常近乎全黑或满是空洞。 在调整大小期间,如果新帧看起来尚未绘制,Bromure 会在一段有限的时间内把上一帧已绘制的 画面保留在屏幕上,同时主机和客户机协同控制调整大小的节奏。这项检查倾向于保留,所以在 调整大小期间,深色页面可能会短暂滞后。不在调整大小时,帧会立即显示。
在一次有四台 VM、24 个标签页和 40 次网站访问的跟踪运行中,四段 200 秒的录制里没有 出现近乎全黑的帧。
光标 alpha。 Linux 以一种没有 alpha 通道的格式分配光标图像,然后又把这块内存当作带 alpha 的光标使用。渲染器保留客户机写入的 alpha 值,所以光标保持透明。
背压。 客户机提交 3D 命令的速度可能快于主机重放的速度。Bromure 把每次提交的上限 设为 1 MiB,并重用同一个 Metal 命令队列来捕获帧。
它是如何构建的
整个实现由 Astra 6.1 完成,它以两个代理的形式在 Bromure 中运行:一个在 Mac 上,一个在 Linux 中。需求由我们制定,结果由我们测试。
- macOS 代理构建了渲染器、Virtio 设备,以及呈现和输入部分。
- Linux 代理构建了 Mesa 和 VirGL 的打包、前提条件检查,以及 VM 中的指针代理和调整 大小监视器。
- 独立的回归测试和源代码审查在整个过程中检查了这些工作。
两个代理在同一个共享的功能分支上工作。它们通过 Bromure 的代理消息功能,在两个环境之间 交换消息、附件、请求和测试证据。主机负责中转、审查并记录消息,并在机器之间拷贝附加的 文件。即将推出的 Bromure Sidecar 应用是这项更大工作的一部分;它发布时我们会再介绍。
开启与关闭
在 Bromure 5 中,Metal 渲染器位于每个 Bromure Web 配置文件的性能下。它默认开启, 已有的配置文件也一样。
- 它需要 macOS 27。在 macOS 26 及更早版本上,Bromure 继续以软件渲染。
- 全局设置仍是总开关,更改对新窗口生效。
- 关闭了它的配置文件会获得自己的 VM,走旧的图形路径。
- VM 镜像需要一个标记,表明我们已针对新渲染器验证过它。没有这个标记,Bromure 会退回到 软件渲染。
我们在 macOS 27 上验证了旧的图形路径,并在一台运行 macOS 26 的 Mac 上测试了它。新代码 需要 macOS 27 或更高版本。