
2026/01/21 23:54
**Show HN:** 「ChartGPU」― WebGPU を活用したチャーティングライブラリ(1,000,000 点を 60fps で描画)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
ChartGPUは、WebGPUを活用して大規模で多系列のデータセットを高フレームレートかつ最小限のCPU使用量で描画するTypeScript製チャーティングライブラリです。ライン・エリア・バー・散布図・円グラフ・ローソク足など一般的なチャートタイプに対応し、ビルトインテーマプリセット(
'dark' | 'light')と完全なカスタムテーマサポートを提供します。
APIは
ChartGPU.create(container, options) から始まり、生成されるインスタンスは setOption、ストリーミング更新用の appendData(...)、resize()、requestAnimationFrame といったメソッドを公開します。描画はレイアウト、スケール、GPUバッファへのデータアップロード、およびグリッド・エリア・バー・散布図・ライン・円グラフ・ローソク足・クロスヘア・ハイライト・軸の複数GPUレンダーパスを管理するレンダーコーディネーターによって統括されます。
インタラクションオーバーレイはイベントマネージャにより処理され、ヒットテスト補助関数(
findNearestPoint、findPieSlice)と click・mouseover・mouseout イベントを発火します。サポートされるインタラクションにはホバーハイライト、ツールチップ、クロスヘア、およびジェスチャーまたはスライダーUIによるX軸ズームがあります。
複数のチャート間でクロスヘアの動きを同期する
connectCharts(charts) が用意されています。
インストールは npm (
npm install chartgpu) で行い、React バインディングは別パッケージ chartgpu-react にて提供されます。ブラウザ対応は WebGPU を必要とし、Chrome 113+、Edge 113+、Safari 18+(デフォルトで有効)に対応しています。Firefox は現在未サポートです。
ChartGPU は MIT ライセンスのオープンソースであり、ドキュメントは
docs/API.md にあります。例プロジェクトは examples/ フォルダー内にあり、貢献ガイドラインは CONTRIBUTING.md で確認できます。
将来リリースでは Firefox サポートと追加のチャートまたはインタラクション機能を予定しており、データ集約型ダッシュボード、金融分析ツール、およびリアルタイムモニタリングインターフェイスに対するパフォーマンス向上も継続的に行われます。
本文
WebGPUを駆使したハイパフォーマンスチャート
概要
ChartGPU は、WebGPU をベースに構築された TypeScript のチャーティングライブラリです。大量データでもスムーズでインタラクティブな描画が可能です。
特色
- 🚀 WebGPU アクセラレーション により、大規模データセットでも高 FPS を実現
- 📈 複数系列タイプ:ライン、エリア、バー、散布図、パイ、キャンドルスティック
- 🧭 組み込みインタラクション:ホバーハイライト、ツールチップ、クロスハイダー
- 🔁
(座標系列)でのストリーミング更新appendData(...) - 🔍 X 軸ズーム(ジェスチャー + オプションのスライダ UI)
- 🎛️ テーマプリセット(
)とカスタムテーマ対応'dark' | 'light'
アーキテクチャ
高レベルでは、
ChartGPU.create(...) がキャンバス+WebGPU のライフサイクルを所有し、描画オーケストレーションはレンダーコーディネータへ委譲します。詳細な内部設計は docs/API.md(特に「Render coordinator」)をご覧ください。
flowchart TB UserApp["Consumer app"] --> PublicAPI["src/index.ts (Public API exports)"] PublicAPI --> ChartCreate["ChartGPU.create(container, options)"] PublicAPI --> SyncAPI["connectCharts(charts)"] subgraph ChartInstance["Chart instance (src/ChartGPU.ts)"] ChartCreate --> SupportCheck["checkWebGPUSupport()"] ChartCreate --> Canvas["Create canvas + mount into container"] ChartCreate --> Options["resolveOptions(options)"] ChartCreate --> GPUInit["GPUContext.create(canvas)"] ChartCreate --> Coordinator["createRenderCoordinator(gpuContext, resolvedOptions)"] ChartCreate --> InstanceAPI["ChartGPUInstance APIs"] InstanceAPI --> RequestRender["requestAnimationFrame (coalesced)"] RequestRender --> Coordinator InstanceAPI --> SetOption["setOption(...)"] InstanceAPI --> AppendData["appendData(...)"] InstanceAPI --> Resize["resize()"] subgraph PublicEvents["Public events + hit‑testing (ChartGPU.ts)"] Canvas --> PointerHandlers["Pointer listeners"] PointerHandlers --> PublicHitTest["findNearestPoint() / findPieSlice()"] PointerHandlers --> EmitEvents["emit('click'/'mouseover'/'mouseout')"] end DataZoomSlider["dataZoom slider UI (DOM)"] --> Coordinator end subgraph WebGPUCore["WebGPU core (src/core/GPUContext.ts)"] GPUInit --> AdapterDevice["navigator.gpu.requestAdapter/device"] GPUInit --> CanvasConfig["canvasContext.configure(format)"] end subgraph RenderCoordinatorLayer["Render coordinator (src/core/createRenderCoordinator.ts)"] Coordinator --> Layout["GridArea layout"] Coordinator --> Scales["xScale/yScale (clip space for render)"] Coordinator --> DataUpload["createDataStore(device) (GPU buffer upload/caching)"] Coordinator --> RenderPass["Encode + submit render pass"] subgraph InternalOverlays["Internal interaction overlays (coordinator)"] Coordinator --> Events["createEventManager(canvas, gridArea)"] Events --> OverlayHitTest["hover/tooltip hit‑testing"] Events --> InteractionX["interaction-x state (crosshair)"] Coordinator --> OverlaysDOM["DOM overlays: legend / tooltip / text labels"] end end subgraph Renderers["GPU renderers (src/renderers/*)"] RenderPass --> GridR["Grid"] RenderPass --> AreaR["Area"] RenderPass --> BarR["Bar"] RenderPass --> ScatterR["Scatter"] RenderPass --> LineR["Line"] RenderPass --> PieR["Pie"] RenderPass --> CandlestickR["Candlestick"] RenderPass --> CrosshairR["Crosshair overlay"] RenderPass --> HighlightR["Hover highlight overlay"] RenderPass --> AxisR["Axes/ticks"] end subgraph Shaders["WGSL shaders (src/shaders/*)"] GridR --> gridWGSL["grid.wgsl"] AreaR --> areaWGSL["area.wgsl"] BarR --> barWGSL["bar.wgsl"] ScatterR --> scatterWGSL["scatter.wgsl"] LineR --> lineWGSL["line.wgsl"] PieR --> pieWGSL["pie.wgsl"] CandlestickR --> candlestickWGSL["candlestick.wgsl"] CrosshairR --> crosshairWGSL["crosshair.wgsl"] HighlightR --> highlightWGSL["highlight.wgsl"] end subgraph ChartSync["Chart sync (src/interaction/createChartSync.ts)"] SyncAPI --> ListenX["listen: 'crosshairMove'"] SyncAPI --> DriveX["setCrosshairX(...) on peers"] end InteractionX --> ListenX DriveX --> InstanceAPI
デモ
- キャンドルスティックチャート – 金融 OHLC(Open‑High‑Low‑Close)レンダリング。クラシック/ホロウスタイル切替と色カスタマイズが可能。
クイックスタート
import { ChartGPU } from 'chartgpu'; const container = document.getElementById('chart')!; await ChartGPU.create(container, { series: [ { type: 'line', data: [[0, 1], [1, 3], [2, 2]] }, ], });
インストール
npm install chartgpu
React 統合
React バインディングは
chartgpu-react で利用可能です:
npm install chartgpu-react
import { ChartGPUChart } from 'chartgpu-react'; function MyChart() { return ( <ChartGPUChart options={{ series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }], }} /> ); }
chartgpu-react リポジトリに完全なドキュメントとサンプルがあります。
ブラウザ対応(WebGPU 必須)
| Browser | Version |
|---|---|
| Chrome | 113+ |
| Edge | 113+ |
| Safari | 18+ |
| Firefox | 未対応(WebGPU は開発中) |
ドキュメント
- Getting Started –
docs/API.md - API Reference –
docs/API.md
サンプル
サンプルは
をご覧ください。examples/
ローカル実行:
npm install npm run dev # http://localhost:5176/examples/ が開きます
コントリビュート
CONTRIBUTING.md をご確認ください。
ライセンス
MIT –
LICENSE を参照。