Canvas 2D 与 WebGL 渲染性能指南
Canvas 绘制优化、WebGL 渲染管线、OffscreenCanvas 与大数据量图形渲染的性能策略。
中后台图表选型决策树、ECharts 主题与性能、Canvas 自绘适用场景与混合架构。
前置阅读:Canvas 与 WebGL 渲染指南 · 本专题第 2 篇
中后台 80% 的「可视化需求」是折线、柱状、饼图、地图——ECharts 足够。自研 Canvas/WebGL 只在 大数据量、定制交互、游戏级帧率 时才值得。这篇是选型决策树,不是库 API 清单。
需要图表?
├─ 标准统计图 + 交互 tooltip → ECharts / AntV G2
├─ 与设计系统深度绑定的 React 组件 → Visx / Recharts
├─ 10万+ 点实时曲线 → Canvas / WebGL 自绘
└─ 3D / 游戏 / 粒子 → WebGL / Three.js
const chart = echarts.init(containerRef.current, theme, { renderer: 'canvas' });
chart.setOption(option, { notMerge: true, lazyUpdate: true });
| 场景 | 建议 |
|---|---|
| 主题 | 抽 echarts-theme.json,与 CSS 变量对齐 |
| 响应式 | ResizeObserver + chart.resize() |
| 大数据 | large: true、progressive、dataZoom |
| SSR | 仅客户端 init,避免 hydration 不一致 |
坑:setOption 默认 merge,切换 tab 时旧 series 残留——切页用 notMerge: true 或 clear()。
自研成本:缩放、tooltip、legend、无障碍几乎都要自己补。团队至少留 1 人周/季度 维护。
Dashboard 常见组合:
ECharts:经营指标卡片、趋势图
Canvas 层:地图热力 overlay
HTML:表格、筛选器
注意 DPR:canvas.width = cssWidth * devicePixelRatio,否则高清屏模糊(见 Canvas 指南)。
| 数据量 | ECharts canvas | 自研 Canvas |
|---|---|---|
| < 5k 点 | 流畅 | 过度工程 |
| 5k–50k | dataZoom + large | 可考虑 |
| > 50k | 需采样 | WebGL 点图 |
系列回顾:第 1 篇 · Canvas/WebGL · 可视化专题