Bromure 5 gibt dem Browser eine GPU
Bromure Web führt Chromium in einer Linux-VM aus, die keine GPU hatte, also zeichnete die CPU jedes WebGL-Bild und jede zusammengesetzte Ebene. Unter macOS 27 gibt Bromure 5 jeder Browser-VM eine GPU auf Basis von Metal. Bei drei WebGL-Lasten sanken die medianen Batch-Zeiten von 170, 965 und 3.555 ms auf 21, 32 und 68 ms: Batches brauchen damit 7 % bis 61 % länger als im nativen Chrome bei denselben Lasten, auf demselben Mac.
Browserhersteller verkaufen Geschwindigkeit mit Zahlen. Apples Safari-Seite nennt Safari „den schnellsten Browser der Welt“ und beansprucht, auf Basis von Apples Tests vom August 2026, unter macOS ein 5,3x schnelleres Rendering als Chrome in MotionMark, einem Benchmark, der „sich auf die Grafikleistung konzentriert“. Google meldete „eine Verbesserung um 22 % seit August 2024“ in Speedometer und schätzte, dass dies Nutzern, die 10 Minuten am Tag surfen, 116 Millionen Stunden Wartezeit erspart. Im Juni 2026 veröffentlichte Google Rekordwerte von 469 in JetStream und 61 in Speedometer. Microsoft sagt, ab Version 134 sei „Microsoft Edge, gemessen mit dem Benchmark Speedometer 3.0, bis zu 9 % schneller“. Die Teams hinter Blink, Gecko und WebKit haben Speedometer 3.0 gemeinsam gebaut.
Sie vergleichen Bromure Web mit diesen Browsern, also muss es mit ihnen mithalten.
Ein Browser ohne GPU
Bromure Web führt Chromium in einer wegwerfbaren Linux-VM auf Ihrem Mac aus. Bis Bromure 5 hatte diese VM keine GPU.
Apples Framework ParavirtualizedGraphics „implementiert hardwarebeschleunigte
Grafik für macOS, das in einer virtuellen Maschine
läuft“, der
unterstützte Weg für macOS-Gäste. Für Linux-Gäste bietet das
Virtualization-Framework ein Virtio-Grafikgerät,
das man mit einer Bildschirmgröße konfiguriert. In unserer VM gab es Chromium
einen Bildschirm und keine 3D-Beschleunigung, also wich Chromium auf Mesas
llvmpipe aus, das OpenGL auf der CPU ausführt, und schaltete das
GPU-Compositing ab. Die Seiten zeichneten die richtigen Pixel, und Karten,
Canvas-Diagramme, 3D-Viewer und Design-Werkzeuge krochen.
Wie Bromure 5 eine GPU hinzufügt
macOS 27 lässt eine App mit VZCustomVirtioDeviceConfiguration ein eigenes
Virtio-Gerät implementieren. Bromure 5 nutzt das, um eine standardmäßige
Virtio-GPU (Gerätetyp 16) bereitzustellen, sodass der Gast keinen eigenen
Kerneltreiber braucht. Es nutzt Ubuntu 24.04 und das mitgelieferte
Kernelmodul virtio_gpu; das kompatible Browser-Image enthält außerdem ein
festgelegtes und gepatchtes Mesa im Userspace sowie eine Video-Integration für
den Browser.
Ein WebGL-Bild nimmt jetzt diesen Weg:
- Chromium zeichnet über ANGLE auf den VirGL-Treiber von Mesa.
- VirGL schickt die OpenGL-Befehle über die Warteschlangen der Virtio-GPU.
- Ein Renderer-Worker auf dem Mac spielt sie über ANGLE auf Metal ab.
- Das Browserfenster zeigt die fertigen Bilder als IOSurfaces.
- Ein Renderer pro VM. Jede Browser-VM bekommt ihren eigenen Renderer-Prozess in einer Sandbox. In Tests verwendeten zwei Worker dieselben Kennungen und behielten trotzdem getrennte Oberflächen, und der zweite lief weiter, nachdem der erste geschlossen wurde.
- Nativer Cursor. macOS zeichnet den Zeiger aus den Cursor-Bildern, die der Gast schickt.
- H.264 in Hardware. Bromure verbindet den Videodecoder des Gasts mit VideoToolbox. AV1 dekodiert Chromium weiterhin in Software.
- Nur Grafik. Das Gerät überträgt Rendering und Videodekodierung, aber keine allgemeinen GPU-Berechnungen, also kann Code in der VM keine Machine-Learning-Lasten auf Ihrer GPU ausführen.
Die Zahlen
Wir haben eine WebGL-Last auf drei Arten auf einem Mac ausgeführt: Chrome in
der Bromure-VM mit dem neuen Renderer, Chrome in derselben VM auf Apples
Grafikgerät (und damit auf llvmpipe) und Chrome unter macOS.
| Last | Bromure-VM, Metal-Renderer | Dieselbe VM, Apple-VZ-Grafik (Software) | Natives Chrome unter macOS |
|---|---|---|---|
| 2.048 Draws mit 64 × 64 | 20,8 ms | 169,5 ms | 12,9 ms |
| 64 Draws mit 1.280 × 720, 32 Shader-Iterationen | 32,2 ms | 965,2 ms | 22,8 ms |
| 24 Draws mit 1.920 × 1.080, 128 Shader-Iterationen | 68,2 ms | 3.555,1 ms | 63,9 ms |
Jeder Wert ist der Median aus fünf Durchläufen, gemessen als reale Zeit bis zum Abschluss eines Batches von GPU-Arbeit. Niedriger ist besser.

Gegenüber dem Software-Rendering lief der neue Pfad 8,1x, 30,0x und 52,1x schneller, und der Abstand wuchs mit der Pixelarbeit. Gegenüber dem nativen Chrome brauchte die VM 1,61x, 1,41x und 1,07x so lange. Viele kleine Draw-Calls kosten am meisten, und beim schwersten Shader kam die VM bis auf 7 % an das native Chrome heran.
Aufbau: Bromure 5.0.1 auf einem Apple M5 Pro mit 18 CPU-Kernen und 64 GB, unter macOS 27.0.1. Die VM lief mit Ubuntu 24.04 ARM64, Mesa 25.2.8, 9 vCPUs und 4 GB. Alle drei Pfade nutzten Chrome 154.0.8037.57. Jede Messung beginnt mit einem Aufwärmen und endet mit dem Zurücklesen eines Pixels, das die GPU zum Abschluss zwingt. Die Zeiten umfassen also Browser, Treiber und Zurücklesen und lassen die Shader-Kompilierung außen vor.
Wie die Bilder auf den Bildschirm kommen
Veröffentlichen beim Flush. Ein Virtio-GPU-Gast benennt zuerst die Scanout-Ressource und löst einen Flush aus, sobald der Inhalt fertig ist. Unsere erste Version veröffentlichte beim Scanout und konnte eine halb gezeichnete Oberfläche zeigen. Bromure aktualisiert das Fenster jetzt beim Flush.
Ein begrenztes Festhalten beim Ändern der Größe. Bei einer neuen Größe kommt das erste Bild oft fast schwarz oder voller Löcher heraus, bevor die Seite neu zeichnet. Während einer Größenänderung behält Bromure das vorherige gezeichnete Bild für eine begrenzte Zeit auf dem Bildschirm, solange das neue ungezeichnet aussieht, und Host und Gast takten die Größenänderung gemeinsam. Die Prüfung neigt im Zweifel zum Festhalten, sodass eine dunkle Seite bei einer Größenänderung kurz hinterherhinken kann. Außerhalb einer Größenänderung erscheinen Bilder sofort.
In einem aufgezeichneten Lauf mit vier VMs, 24 Tabs und 40 Website-Besuchen enthielten vier Aufzeichnungen von je 200 Sekunden kein fast schwarzes Bild.
Cursor-Alpha. Linux legt Cursor-Bilder in einem Format ohne Alphakanal an und verwendet diesen Speicher dann als Cursor mit Alpha. Der Renderer behält die Alphawerte, die der Gast geschrieben hat, sodass Cursor transparent bleiben.
Gegendruck. Der Gast kann 3D-Befehle schneller einreichen, als der Host sie abspielt. Bromure begrenzt jede Einreichung auf 1 MiB und verwendet eine einzige Metal-Command-Queue wieder, um Bilder zu erfassen.
Wie es gebaut wurde
Astra 6.1 hat die gesamte Implementierung geleistet, als zwei Agenten in Bromure: einer auf dem Mac und einer unter Linux. Wir haben die Anforderungen festgelegt und die Ergebnisse getestet.
- Der macOS-Agent baute den Renderer, das Virtio-Gerät sowie Darstellung und Eingabe.
- Der Linux-Agent baute die Paketierung von Mesa und VirGL, die Prüfungen der Voraussetzungen sowie den Zeiger-Agenten und den Größenänderungs-Wächter in der VM.
- Unabhängige Regressionstests und Quellcode-Reviews prüften die Arbeit unterwegs.
Beide Agenten arbeiteten auf demselben gemeinsamen Feature-Branch. Über Bromures Agenten-Messaging tauschten sie Nachrichten, Anhänge, Anfragen und Testnachweise zwischen den beiden Umgebungen aus. Der Host vermittelt, prüft und protokolliert die Nachrichten und kopiert angehängte Dateien zwischen den Maschinen. Die kommende App Bromure Sidecar ist Teil dieser umfassenderen Arbeit; wir beschreiben sie, wenn sie erscheint.
Ein- und ausschalten
In Bromure 5 liegt der Metal-Renderer in jedem Bromure-Web-Profil unter Leistung. Er ist standardmäßig eingeschaltet, auch bei bestehenden Profilen.
- Er braucht macOS 27. Unter macOS 26 und älter rendert Bromure weiterhin in Software.
- Die globale Einstellung bleibt der Hauptschalter, und Änderungen gelten für neue Fenster.
- Ein Profil, in dem er ausgeschaltet ist, bekommt eine eigene VM auf dem alten Grafikpfad.
- Ein VM-Image braucht eine Markierung, die zeigt, dass wir es für den neuen Renderer geprüft haben. Ohne sie fällt Bromure auf Software zurück.
Wir haben den alten Grafikpfad unter macOS 27 überprüft und auf einem Mac mit macOS 26 getestet. Der neue Code setzt macOS 27 oder neuer voraus.