ChartGPU – Hochleistungs-Chartbibliothek auf WebGPU-Basis (rendert 1 Mio. Punkte mit 60 fps)
(github.com/ChartGPU)- Eine Open-Source-Chartbibliothek, die mithilfe von WebGPU große Datensätze flüssig rendert
- In TypeScript geschrieben und unterstützt verschiedene Serientypen wie Linie, Fläche, Balken, Scatter, Kreis und Candlestick
- Integrierte Interaktionsfunktionen wie Hover-Highlighting, Tooltips, Crosshair, Zoom-Gesten und Theme-Presets
- Mit dem React-Integrationspaket (chartgpu-react) auch in React-Umgebungen einfach einsetzbar
- WebGPU-beschleunigtes Rendering liefert eine Leistung auf dem Niveau von 60 Bildern pro Sekunde und eignet sich damit gut für die Visualisierung großer Datenmengen
Überblick
- ChartGPU ist eine Hochleistungsbibliothek für Chart-Rendering auf WebGPU-Basis, mit der sich große Datenmengen flüssig visualisieren lassen
- Entwickelt in TypeScript und veröffentlicht unter der MIT-Lizenz
- Installation mit dem Befehl npm install chartgpu möglich
Hauptfunktionen
- WebGPU-beschleunigtes Rendering hält auch bei großen Datensätzen hohe FPS-Werte
- Unterstützung für verschiedene Diagrammtypen: line, area, bar, scatter, pie, candlestick
- Integrierte Interaktionsfunktionen: hover highlight, tooltip, crosshair
- Unterstützung für Streaming-Updates von Daten (
appendData(...)) - Zoom auf der X-Achse verfügbar (einschließlich Gesten und Slider-UI)
- Theme-Presets (
dark/light) sowie benutzerdefinierte Themes werden unterstützt
Architektur
ChartGPU.create(...)verwaltet den Canvas- und WebGPU-Lebenszyklus, während der Render Coordinator die Rendering-Abstimmung übernimmt- Die interne Struktur besteht aus den folgenden Schichten
- WebGPU Core: Initialisierung von GPU-Adapter und -Gerät, Konfiguration des Canvas
- Render Coordinator: Layout, Skalierung, Daten-Upload und Verwaltung der Render-Passes
- GPU Renderers: Renderer für die jeweiligen Diagrammtypen wie Grid, Area, Bar, Scatter, Line, Pie und Candlestick
- Shaders(WGSL): Shader-Dateien passend zu den jeweiligen Renderern
- Chart Sync: bietet Crosshair-Synchronisierung zwischen mehreren Charts
React-Integration
- Paket chartgpu-react für React verfügbar
- Installation:
npm install chartgpu-react
Browser-Unterstützung
- Erfordert einen Browser mit aktiviertem WebGPU
- Unterstützung für Chrome 113+, Edge 113+, Safari 18+
- Firefox befindet sich derzeit in Entwicklung
1 Kommentare
Hacker-News-Kommentare
Ich bin der Maintainer von uPlot. Dieses Projekt ist interessant, daher werde ich es mir bald genauer ansehen
Mein kurzer Eindruck vom 1M-Demo:
[[0,1],[1,3],[2,2]]erzeugt Millionen kleiner Arrays, daher wäre eine spaltenbasierte Datenstruktur besserÜbrigens gibt es auch ein 2M-Datenpunkte-Demo von uPlot
Sowohl das LTTB-Sampling als auch das Idle-CPU-Problem seien berechtigte Hinweise. Sampling ist im Demo standardmäßig aktiviert, aber mit „sampling: none“ ist ein fairer Vergleich möglich. Er will einen Toggle in die UI einbauen.
Auch das Problem, dass die Render-Schleife im Stillstand weiterläuft, lasse sich beheben. Geplant ist, nur bei Datenänderungen oder Interaktionen zu rendern
Bei Liniendiagrammen kann man adaptiv auf Basis des pixelgenauen Unterschieds zwischen benachbarten Punkten samplen, ohne dass man visuell einen Unterschied sieht, selbst wenn man die meisten Punkte verwirft.
Es ist ineffizient, 1 Million Punkte in einem 1000 Pixel breiten Chart zu zeichnen
Wenn es sehr viele Datenpunkte gibt, sollte man die Zahl der Punkte pro Pixel zählen und die Intensität über Helligkeit oder Farbe darstellen
Das ist ähnlich zum digital phosphor in der Elektronik. Ein Beispiel gibt es unter diesem Link
Besonders bei Scatter Plots ist das nützlich, um Clusterstrukturen sichtbar zu machen. Ich nehme die Idee in die Liste auf
Der Patch für die CPU-Auslastung im Idle-Zustand ist fertig.
Dem 1M-Benchmark-Beispiel wurde ein Toggle „Benchmark mode“ hinzugefügt, damit die Benchmark-Funktion erhalten bleibt und das Ganze im inaktiven Zustand trotzdem effizient läuft
Dass 0 FPS angezeigt werden, ist normal — wenn es nichts zu rendern gibt, werden keine Frames gezeichnet. Bei Bedarf rendert es sofort mit voller Geschwindigkeit
Ich bin von dem engagierten Feedback der Community beeindruckt
Ich entwickle ein browserbasiertes Link-Graph-Analysetool (webvetted.com/workbench)
Ich muss Graphen mit Tausenden von Knoten und Kanten visualisieren; wenn 1M Punkte möglich sind, wäre das eine große Hilfe
Die WebGPU-Rendering-Muster ließen sich aber auch gut auf Graph-Visualisierung anwenden. Der Scatter-Renderer verarbeitet bereits Tausende Instanzen, daher wäre das Hinzufügen von Kanten strukturell nicht schwierig
Er fragt nach Meinungen dazu, ob Graph-Funktionen in ChartGPU integriert oder als separate Bibliothek GraphGPU ausgelagert werden sollten
Beeindruckend. Das wirkt wie eines der beeindruckendsten Demos
Es wäre gut, Linien- und Band-Zeichenfunktionen für Candlesticks hinzuzufügen. Es sollte nicht nur ums Plotten gehen, sondern auch darum, Punkte hervorheben zu können
Früher wollte ich selbst etwas Ähnliches mit WebGPU bauen, aber dieses Projekt macht mir Lust, es direkt auszuprobieren
Ich bin der Maintainer von TimeLine. Das Live-Streaming-Demo von ChartGPU (Link) läuft nicht so flüssig wie erwartet
Zum Vergleich läuft dieses Demo, das mit 2D-Canvas im Main-Thread implementiert ist, deutlich flüssiger
Relevante Dateien: webgpu-pro.md und webgpu-expert.md
Im 1M-Punkte-Beispiel wurde ein Slider-Bug entdeckt (Link)
Beim Ziehen bleibt der Slider nicht unter dem Cursor, sondern springt um eine unerwartete Distanz
Es handelt sich um ein Koordinaten-Mapping-Problem beim Data-Zoom-Slider, das jetzt höher priorisiert behoben werden soll
Glückwunsch, aber 1M Punkte sind im Finanzbereich eher normal
Die Rendering-Engine, an der ich gerade arbeite, hat die Leistung von bisherigen 10 Millionen Punkten auf 100 Millionen Punkte gesteigert
Siehe Demo-Video
Plotly konnte schon vor Jahren mit WebGL mehr als zehn Millionen Punkte verarbeiten
Es gibt viele Bibliotheken mit ähnlichen Funktionen
Siehe Performance-Demo