ChartGPU – bibliothèque de graphiques haute performance basée sur WebGPU (rendu de 1 M de points à 60 fps)
(github.com/ChartGPU)- WebGPU est utilisé pour rendre de grands ensembles de données de manière fluide dans cette bibliothèque de graphiques open source
- Écrite en TypeScript, elle prend en charge divers types de séries, dont ligne, aire, barres, nuage de points, camembert et chandelier
- Intègre des fonctions interactives comme mise en surbrillance au survol, infobulles, réticule, gestes de zoom et préréglages de thèmes
- Le package d’intégration React (
chartgpu-react) permet aussi une utilisation simple dans un environnement React - Le rendu accéléré par WebGPU offre des performances de l’ordre de 60 images par seconde, ce qui en fait un outil adapté à la visualisation de données à grande échelle
Aperçu
- ChartGPU est une bibliothèque de rendu de graphiques haute performance basée sur WebGPU, capable de visualiser de grandes quantités de données de façon fluide
- Développée en TypeScript et publiée sous licence MIT
- Installation possible avec la commande npm install chartgpu
Fonctionnalités principales
- Rendu accéléré par WebGPU pour maintenir un FPS élevé même avec de grands ensembles de données
- Prise en charge de différents types de graphiques : line, area, bar, scatter, pie, candlestick
- Fonctions interactives intégrées : hover highlight, tooltip, crosshair
- Prise en charge des mises à jour par streaming de données (
appendData(...)) - Fonction de zoom sur l’axe X (avec gestes et interface à curseur)
- Préréglages de thèmes (
dark/light) et prise en charge de thèmes personnalisés
Architecture
ChartGPU.create(...)gère le canvas et le cycle de vie WebGPU, tandis que le Render Coordinator s’occupe de l’orchestration du rendu- La structure interne se compose des couches suivantes
- WebGPU Core : initialisation de l’adaptateur GPU et du périphérique, configuration du canvas
- Render Coordinator : gestion de la mise en page, des échelles, de l’envoi des données et des passes de rendu
- GPU Renderers : moteurs de rendu par type de graphique, comme Grid, Area, Bar, Scatter, Line, Pie et Candlestick
- Shaders (WGSL) : ensemble de fichiers de shaders correspondant à chaque moteur de rendu
- Chart Sync : fournit une fonction de synchronisation du réticule entre plusieurs graphiques
Intégration React
- Package chartgpu-react disponible pour React
- Installation :
npm install chartgpu-react
Compatibilité navigateur
- Nécessite un navigateur avec WebGPU activé
- Compatible avec Chrome 113+, Edge 113+ et Safari 18+
- Firefox est actuellement en cours de développement
1 commentaires
Avis sur Hacker News
Je suis le mainteneur de uPlot. Ce projet m’intéresse, donc je vais bientôt l’examiner en profondeur.
Après un rapide coup d’œil à la démo 1M, voici mon impression :
[[0,1],[1,3],[2,2]]oblige à créer des millions de petits tableaux, donc il vaudrait mieux passer à une structure de données en colonnesÀ noter que uPlot a aussi une démo à 2M de points de données
Les remarques sur l’échantillonnage LTTB et sur le CPU au repos sont toutes deux pertinentes ; l’échantillonnage est activé par défaut dans la démo, mais on peut faire une comparaison équitable avec
sampling: none. Il prévoit d’ajouter un toggle dans l’interface.Le problème de boucle de rendu qui continue de tourner même à l’arrêt peut être corrigé. Il prévoit de faire en sorte que le rendu ne se déclenche qu’en cas de changement de données ou d’interaction
Pour un graphique en ligne, si on fait un échantillonnage adaptatif selon la différence en pixels entre points adjacents, on peut supprimer la plupart des points sans différence visuelle notable.
Dessiner 1 million de points sur un graphique large de 1000 pixels est inefficace
Quand il y a énormément de points de données, il vaut mieux compter combien de points recouvre chaque pixel et représenter l’intensité par la luminosité ou la couleur
C’est similaire à l’approche digital phosphor en électronique. Voir ce lien pour un exemple
C’est particulièrement utile pour révéler la structure des clusters dans un scatter plot. J’ajoute l’idée à la liste
Le patch d’utilisation CPU au repos est terminé.
Un toggle « Benchmark mode » a été ajouté à l’exemple de benchmark 1M, afin de conserver les fonctions de benchmark tout en restant efficace à l’état inactif
Il est normal que le FPS affiche 0 — s’il n’y a rien à rendre, aucune frame n’est dessinée. Dès qu’il faut rendre quelque chose, cela repart immédiatement à vitesse maximale
J’ai été touché par les retours passionnés de la communauté
Je développe un outil d’analyse de Link Graph dans le navigateur (webvetted.com/workbench)
Je dois visualiser des graphes avec des milliers de nœuds et d’arêtes, donc si cela peut traiter 1M de points, ce serait d’une grande aide
Cela dit, les patterns de rendu WebGPU peuvent très bien s’appliquer à la visualisation de graphes. Le moteur de scatter gère déjà des milliers d’instances, donc ajouter les arêtes ne serait pas structurellement difficile
Il demande s’il vaudrait mieux intégrer les fonctions de graphe à ChartGPU ou les séparer dans une bibliothèque GraphGPU dédiée
Impressionnant. J’ai trouvé que c’était l’une des démos les plus impressionnantes
Ce serait bien d’ajouter une fonction de tracé de lignes et de bandes pour les chandeliers. Il ne faut pas seulement pouvoir tracer, mais aussi mettre certains points en évidence
J’avais déjà essayé de faire quelque chose de similaire moi-même avec WebGPU, et ce projet me donne envie de l’essayer directement
Je suis le mainteneur de TimeLine. La démo de streaming live de ChartGPU (lien) n’est pas aussi fluide que prévu
À titre de comparaison, cette démo implémentée en canvas 2D sur le thread principal tourne beaucoup plus fluidement
Voir les fichiers webgpu-pro.md et webgpu-expert.md
Quelqu’un a trouvé un bug du slider dans l’exemple 1M de points (lien)
Pendant le glisser-déposer, le slider ne reste pas sous le curseur et se déplace d’une distance inattendue
Il s’agit d’un problème de mapping des coordonnées du slider de zoom sur les données, et il va le corriger en priorité
Félicitations, mais 1M de points reste banal dans la finance
Le moteur de rendu en cours de développement a déjà fait passer les performances de 10 millions de points à 100 millions de points
Voir la vidéo de démo
Plotly pouvait déjà traiter plus de dix millions de points en WebGL il y a plusieurs années
Il existe de nombreuses bibliothèques aux fonctionnalités similaires
Voir la démo de performance