用 WebGPU 驱动的前端图表库,声称 50M 数据点 60 帧流畅渲染
传统前端图表库在面对大规模数据时,通常会遇到性能瓶颈:Canvas 2D 或 SVG 的渲染逻辑跑在 CPU 上,数据量一旦上涨到百万级别,帧率下降、交互卡顿就会成为绕不开的问题。
ChartGPU 尝试从另一个方向解决这个问题——把渲染任务交给 GPU。它是一个基于 WebGPU 的开源 TypeScript 图表库,自称"最快的开源图表库",官方给出的基准数据是:3500 万数据点约 72 FPS,500 万根 K 线图实时更新超过 100 FPS。
WebGPU 是浏览器的新一代图形 API(可以理解为允许网页直接调用显卡能力的标准),目前已在 Chrome 113+、Edge 113+、Safari 18+ 和 Firefox(Windows 114+、Mac 145+)中得到支持。ChartGPU 建立在这个基础上,将大量原本在 CPU 侧完成的数据处理和绘制计算转移到 GPU,从而获得更高的吞吐能力。

支持哪些图表类型
ChartGPU 目前支持六种图表类型:折线图、面积图、柱状图、散点图、饼图和 K 线图(candlestick)。
其中值得单独提到的是散点密度图(scatter density)。当散点数量达到百万级别时,普通的散点图会因为点位重叠而失去信息密度,ChartGPU 提供了一个 mode: 'density' 配置,将密集区域以热力图方式呈现,可以在 100 万以上数据点的场景下直观识别分布规律。

此外,库内置了以下交互能力:
- 悬停高亮与 Tooltip:鼠标悬停时展示对应数据点的详细信息
- 十字准线(Crosshair):跟随鼠标移动,辅助定位
- X 轴缩放:支持可选的滑动条 UI,用于快速浏览长时间序列数据
- 注释系统:支持在图表上添加参考线、点标记和文字注释,并提供撤销/重做操作
流式数据更新
对于金融行情、监控指标等实时场景,ChartGPU 提供了 appendData() 方法,支持在不重新渲染整张图的前提下追加新数据。该方法接受 TypedArray 格式的数据(例如 Float64Array),减少了频繁 GC 的压力。
// 向已有图表追加新数据点
chart.appendData('series-0', new Float64Array([timestamp, value]));多图表共享 GPU 资源
在需要同时展示多个图表的 Dashboard 场景中,每个图表单独初始化 WebGPU 设备会带来不必要的资源开销。ChartGPU 支持多个图表实例共享同一个 GPU 设备和 Pipeline 缓存,从而在密集布局下也能维持较低的资源占用。
安装与使用
安装方式
npm install chartgpuReact 项目可以使用专属绑定包:
npm install chartgpu-react前提条件:需要浏览器支持 WebGPU。目前主流版本的 Chrome、Edge 和 Safari 已默认启用,Firefox 需确认版本号。
基础用法
创建一个带有明确宽高的 HTML 容器(不设置尺寸会导致渲染异常),然后调用 ChartGPU.create() 初始化图表:
import { ChartGPU } from 'chartgpu';
const container = document.getElementById('chart')!;
// create() 是异步方法,需要 await
const chart = await ChartGPU.create(container, {
series: [
{
type: 'line',
data: [
[0, 1],
[1, 3],
[2, 2],
],
},
],
});对应的 HTML 容器示例:
<div id="chart" style="width: 800px; height: 400px;"></div>
K 线图(适用于行情数据)
const chart = await ChartGPU.create(container, {
series: [
{
type: 'candlestick',
data: [
// [timestamp, open, high, low, close]
[1700000000000, 100, 110, 95, 105],
[1700003600000, 105, 115, 100, 108],
],
},
],
});
散点密度图(适用于大规模点云)
const chart = await ChartGPU.create(container, {
series: [
{
type: 'scatter',
mode: 'density', // 开启密度热力图模式
data: largeDataArray,
},
],
});
页面卸载时的清理
WebGPU 资源需要手动释放,建议在页面卸载时调用 dispose():
window.addEventListener('unload', () => {
chart.dispose();
});在 React 中使用
import { ChartGPUReact } from 'chartgpu-react';
function App() {
return (
<ChartGPUReact
style={{ width: '800px', height: '400px' }}
options={{
series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }],
}}
/>
);
}与常见图表库的差异
ChartGPU 和 ECharts、Chart.js 等库的核心差异在于渲染层:
- ECharts / Chart.js:基于 Canvas 2D 或 SVG,渲染逻辑在 CPU 执行,适合中等数据量(通常在几万条以内)的通用场景
- ChartGPU:基于 WebGPU,数据处理和绘制计算在 GPU 执行,在百万至千万级数据点时才能体现出明显的性能差距
换句话说,如果你的图表数据量不大,ChartGPU 相比成熟库并没有显著优势,反而需要考虑 WebGPU 的浏览器兼容限制(老版本浏览器不支持)。它更适合的场景是:金融行情图表(百万级 K 线)、实时监控大盘(持续追加数据)、科学数据可视化(百万级散点分析)。
写在最后
ChartGPU 的方向是把浏览器端的图表渲染推到 GPU,这在技术路线上是有意义的——WebGPU 本身就是为了让 Web 应用能更充分地利用现代硬件而设计的。从官方给出的基准数据来看,在极端数据量下它的表现是有参考价值的。
不过实际接入时需要注意几点:WebGPU 目前仍处于推广阶段,企业内网环境或老设备的兼容问题需要评估;库本身文档还在完善中,复杂定制场景可能需要阅读源码。
如果你的项目正好面临前端图表的性能瓶颈,ChartGPU 值得作为候选方案进行调研。项目提供了 25 个以上的交互示例,可以在本地跑起来直接验证性能表现。
GitHub 项目地址:https://github.com/ChartGPU/ChartGPU (opens in a new tab)