Skip to content

Canvas vs SVG 两种渲染

约 780 字大约 3 分钟

Echarts

2025-07-01

在数据可视化库(如 ECharts、Three.js 等)中,CanvasRendererSVGRenderer 是两种常见的渲染方式,它们的核心区别和选型建议如下:

核心区别对比

特性CanvasRendererSVGRenderer
渲染技术基于像素的位图渲染(<canvas> 元素)基于矢量的 DOM 渲染(<svg> 元素)
性能✅ 高频更新(如动画、大数据量)更流畅⚠️ 适合静态或低频更新场景
内存占用较低(单一块画布)较高(大量 DOM 节点)
缩放表现⚠️ 放大时像素模糊✅ 无限缩放不失真
交互灵活性需手动实现事件检测✅ 原生支持 DOM 事件(如点击、悬停)
兼容性兼容所有现代浏览器兼容性稍差(部分旧浏览器 SVG 支持有限)
导出图片✅ 直接转 PNG/JPG需转换为位图(可能失真)
动态效果适合复杂动画/游戏适合简单过渡效果

选型决策指南

适合 CanvasRenderer 的场景

  1. 数据量巨大:如万级以上的散点图
  2. 高频动态更新:如实时监控仪表盘
  3. 需要复杂视觉、动画效果:如 3D、WebGL 混合渲染
  4. 移动端性能敏感场景:减少 DOM 压力

适合 SVGRenderer 的场景

  1. 需要矢量无损缩放:如高精度地图
  2. 依赖 DOM 交互:如复杂的图元点击检测
  3. 导出矢量图:如 PDF/SVG 格式报表
  4. SEO 友好需求:SVG 内容可被爬虫解析
  5. 大量简单图表:如几十个内容比较简单的图表

总结起来

大多数情况下,我们遇到的都是比较简单的图表,内容也比较少。

  • 如果带一点交互,比如点击查看某个指标,优先选择 SVGRenderer
  • 如果不带交互,仅仅显示一些指标,或者带点简单的动画效果,选择 SVGRenderer,也可以使用 div + css
  • 只要内容特别复杂,比如需要 3D 效果、动态交互等,无脑选 CanvasRenderer

性能实测数据

场景Canvas (FPS)SVG (FPS)
静态图表(1000 元素)6060
动态更新(1000 点/秒)55-6020-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