- WebGPU dimanfaatkan untuk merender library chart open source bagi dataset besar secara mulus
- Ditulis dengan TypeScript dan mendukung berbagai tipe seri seperti line, area, bar, scatter, pie, candlestick
- Menyertakan fitur interaktif bawaan seperti hover highlight, tooltip, crosshair, gesture zoom, dan preset tema
- Dapat digunakan dengan mudah di lingkungan React melalui paket integrasi React (chartgpu-react)
- Dengan rendering berakselerasi WebGPU, library ini menawarkan performa sekitar 60 frame per detik dan cocok untuk visualisasi data skala besar
Ringkasan
- ChartGPU adalah library rendering chart berkinerja tinggi berbasis WebGPU yang dapat memvisualisasikan data dalam jumlah besar secara mulus
- Dikembangkan dengan TypeScript dan dirilis di bawah lisensi MIT
- Dapat diinstal dengan perintah npm install chartgpu
Fitur utama
- Menjaga FPS tinggi pada dataset besar melalui rendering berakselerasi WebGPU
- Mendukung berbagai jenis chart: line, area, bar, scatter, pie, candlestick
- Menyertakan fitur interaktif bawaan: hover highlight, tooltip, crosshair
- Mendukung pembaruan data streaming (
appendData(...))
- Menyediakan fitur zoom sumbu X (termasuk gesture dan UI slider)
- Mendukung preset tema (
dark / light) serta tema kustom
Arsitektur
ChartGPU.create(...) mengelola canvas dan siklus hidup WebGPU, sementara penyesuaian rendering ditangani oleh Render Coordinator
- Struktur internalnya terdiri dari lapisan berikut
- WebGPU Core: inisialisasi adaptor dan device GPU, konfigurasi canvas
- Render Coordinator: tata letak, skala, unggah data, dan manajemen render pass
- GPU Renderers: renderer untuk tiap chart seperti Grid, Area, Bar, Scatter, Line, Pie, Candlestick
- Shaders (WGSL): kumpulan file shader yang sesuai untuk masing-masing renderer
- Chart Sync: menyediakan fitur sinkronisasi crosshair antar beberapa chart
Integrasi React
- Tersedia paket React chartgpu-react
- Instalasi:
npm install chartgpu-react
Dukungan browser
- Memerlukan browser dengan WebGPU aktif
- Mendukung Chrome 113+, Edge 113+, Safari 18+
- Firefox saat ini masih dalam pengembangan
1 komentar
Komentar Hacker News
Saya maintainer uPlot. Proyek ini menarik, jadi saya akan mempelajarinya lebih dalam dalam waktu dekat
Kesan singkat saya setelah melihat demo 1M:
[[0,1],[1,3],[2,2]]mengharuskan pembuatan jutaan array kecil, jadi lebih baik diubah ke struktur data berbasis kolomSebagai referensi, ada juga demo 2M data point milik uPlot
Masukan soal sampling LTTB dan masalah CPU idle sama-sama valid, dan sampling memang aktif secara default di demo, tetapi bisa dibuat adil dengan
sampling: none. Ia berencana menambahkan toggle di UI.Masalah loop render yang terus berjalan bahkan saat diam juga bisa diperbaiki. Ia berencana mengubahnya agar render hanya terjadi saat data berubah atau ada interaksi
Untuk line chart, jika adaptive sampling dilakukan berdasarkan perbedaan piksel antar titik yang berdekatan, sebagian besar titik bisa dibuang tanpa perbedaan visual yang berarti.
Menggambar 1 juta titik pada chart selebar 1000 piksel itu tidak efisien
Saat jumlah data point sangat besar, sebaiknya hitung berapa banyak titik yang dicakup setiap piksel lalu tampilkan intensitas lewat kecerahan atau warna
Ini mirip pendekatan digital phosphor dalam elektronika. Lihat contoh di tautan ini
Ini sangat berguna terutama pada scatter plot untuk menampilkan struktur klaster. Saya tambahkan ke daftar ide
Patch penggunaan CPU idle sudah selesai.
Saya menambahkan toggle “Benchmark mode” ke contoh benchmark 1M agar fungsi benchmark tetap ada, tetapi saat tidak aktif perilakunya jadi efisien
Jika FPS ditampilkan 0, itu normal — kalau tidak ada yang perlu dirender, tidak ada frame yang digambar
Saat diperlukan, render akan langsung berjalan pada kecepatan maksimum
Saya tersentuh oleh umpan balik antusias dari komunitas
Saya sedang mengembangkan alat analisis Link Graph berbasis browser (webvetted.com/workbench)
Saya perlu memvisualisasikan graf dengan ribuan node/edge, jadi kalau bisa menangani 1M point, ini sepertinya akan sangat membantu
Namun, pola rendering WebGPU sangat cocok juga untuk visualisasi graf. Renderer scatter yang ada sudah menangani ribuan instance, jadi menambahkan edge secara struktural seharusnya tidak terlalu sulit
Ia menanyakan apakah fitur graf sebaiknya diintegrasikan ke ChartGPU, atau dipisah sebagai library GraphGPU terpisah
Mengesankan. Rasanya ini salah satu demo paling mengesankan
Akan bagus jika ditambahkan fitur menggambar garis dan band untuk candlestick. Bukan sekadar plotting, tapi juga harus bisa menyorot point
Dulu saya sempat mencoba membuat hal serupa sendiri dengan WebGPU, dan proyek ini membuat saya ingin langsung mencobanya
Saya maintainer TimeLine. Demo live streaming ChartGPU (tautan) ternyata tidak semulus yang saya harapkan
Sebagai perbandingan, demo ini yang dibuat dengan canvas 2D di main thread berjalan jauh lebih mulus
Lihat file terkait: webgpu-pro.md dan webgpu-expert.md
Saya menemukan bug slider di contoh 1M point (tautan)
Saat di-drag, slider tidak tetap berada di bawah kursor dan malah berpindah dengan jarak yang tidak terduga
Ini adalah masalah pemetaan koordinat pada slider data zoom, dan prioritasnya akan dinaikkan untuk diperbaiki
Selamat, tetapi 1M point itu level biasa saja di bidang finansial
Mesin rendering yang sedang saya kembangkan kini telah meningkatkan performa dari 10 juta point menjadi 100 juta point
Lihat video demo
Plotly sudah bisa menangani lebih dari 10 juta point dengan WebGL sejak beberapa tahun lalu
Ada banyak library dengan kemampuan serupa
Lihat demo performa