Canvas vs SVG 两种渲染
在数据可视化库(如 ECharts、Three.js 等)中,CanvasRenderer
和 SVGRenderer
是两种常见的渲染方式,它们的核心区别和选型建议如下:
核心区别对比
特性 | CanvasRenderer | SVGRenderer |
---|---|---|
渲染技术 | 基于像素的位图渲染(<canvas> 元素) | 基于矢量的 DOM 渲染(<svg> 元素) |
性能 | ✅ 高频更新(如动画、大数据量)更流畅 | ⚠️ 适合静态或低频更新场景 |
内存占用 | 较低(单一块画布) | 较高(大量 DOM 节点) |
缩放表现 | ⚠️ 放大时像素模糊 | ✅ 无限缩放不失真 |
交互灵活性 | 需手动实现事件检测 | ✅ 原生支持 DOM 事件(如点击、悬停) |
兼容性 | 兼容所有现代浏览器 | 兼容性稍差(部分旧浏览器 SVG 支持有限) |
导出图片 | ✅ 直接转 PNG/JPG | 需转换为位图(可能失真) |
动态效果 | 适合复杂动画/游戏 | 适合简单过渡效果 |
选型决策指南
适合 CanvasRenderer
的场景
- 数据量巨大:如万级以上的散点图
- 高频动态更新:如实时监控仪表盘
- 需要复杂视觉、动画效果:如 3D、WebGL 混合渲染
- 移动端性能敏感场景:减少 DOM 压力
适合 SVGRenderer
的场景
- 需要矢量无损缩放:如高精度地图
- 依赖 DOM 交互:如复杂的图元点击检测
- 导出矢量图:如 PDF/SVG 格式报表
- SEO 友好需求:SVG 内容可被爬虫解析
- 大量简单图表:如几十个内容比较简单的图表
总结起来
大多数情况下,我们遇到的都是比较简单的图表,内容也比较少。
- 如果带一点交互,比如点击查看某个指标,优先选择
SVGRenderer
- 如果不带交互,仅仅显示一些指标,或者带点简单的动画效果,选择
SVGRenderer
,也可以使用 div + css - 只要内容特别复杂,比如需要 3D 效果、动态交互等,无脑选
CanvasRenderer
性能实测数据
场景 | Canvas (FPS) | SVG (FPS) |
---|---|---|
静态图表(1000 元素) | 60 | 60 |
动态更新(1000 点/秒) | 55-60 | 20-30 |
极大数据量(10 万点) | 30-40 | <5 |
测试环境:Chrome 120 / i7-12700H / ECharts 5.4
如何切换渲染器
// 初始化时指定渲染器
const chart = echarts.init(dom, null, {
renderer: "canvas", // 或 'svg'
});
// 运行时切换(需 dispose 后重新 init)
chart.dispose();
chart = echarts.init(dom, null, { renderer: "svg" });
更新日志
2025/8/24 08:17
查看所有更新日志
e7112
-1于