Canvas 和 SVG 是两大基于浏览器的渲染方案,在选择图表库的时候,用户有时也会在这两者之间纠结。但是纠结的时候,你是否真的明白这两者在哪些方面有优劣?

ECharts 4.0 推出 Canvas、SVG 双引擎渲染方案,用户可以使用一个配置项一键切换,成为我们所知的第一个支持双引擎的可视化工具。同样的接口,同样的渲染视觉效果,不一样的精彩!

那么,Canvas 与 SVG 分别适用于什么样的场景呢?本文将详细介绍我们提供测试多种平台、多种数据量、多种图表类型等维度的渲染性能,给出在不同场景下的推荐方案。

首先,放出结论大图——

图中,绿色表示推荐使用 SVG,红色表示推荐使用 Canvas,↑箭头越多表示推荐程度越强烈,“-”表示两者差别不大,或者根据不同情况有不同选择。

我们应该如何读懂上图呢?在实际的使用场景中,可能对于同一个图表多个维度的结论是相反的(比如图表个数多的时候 SVG ↑↑↑,但是如果数据量也很大又会 Canvas ↑)。这时候,一方面是参考箭头多少决定哪种影响更大,另一方面如果确实对性能要求比较高,可以参考这个结论自行做更细致的测试。

因为图表本身的属性和展示平台的变化性可能非常丰富,所以很难简单地根据某个维度直接给出结论。本文能做的就是尽可能把一些比较确定性的结论告诉大家(比如移动平台优选 SVG),作为官方给大家指一条相对明确的方向。而用户在实际的使用过程中,如果碰到了性能瓶颈,可以根据这个进一步测试改进。

另外需要注意的是,本文的结论都是针对 ECharts 4.0 版本的实现测试得出的,不同可视化工具的实现方式可能并不一定完全适应。后期性能优化后,也可能会引起其他的变动。

下面,我们就一些重要的结论作说明。

移动平台优选 SVG

在移动端(尤其是低端安卓机)上,由于内存和 CPU 资源的限制,Canvas 的表现可能非常差,而相比之下 SVG 就会有很大优势。

在我们测试的三星 Note 3 和红米 1s 上,一个包含 10 个数据点的折线图,用 Canvas 渲染的初始动画 FPS 分别是 20 与 5;而使用 SVG 渲染,则可以达到 44 与 20。这样的差异是很明显可以感知出的。

SVG 在 iOS 平台的表现也常常优于 Canvas,只是因为 iOS 配置相对更好,这一优势不太显著。比如我们测试的 iPhone 7 上,包含 10 个数据点的折线图在 SVG 和 Canvas 渲染时都是 60 FPS。当数据量达到 1000 时,差异才表现出来,SVG 和 Canvas 分别是 60 与 32 FPS。

因此,我们强烈建议在移动平台优先选择 SVG 进行渲染。

图表个数很多时优选 SVG

当图表个数很多时,占用的内存很大程度上造成了页面是否卡顿的体验差异。在这一情况下,SVG 表现出非常明显的优势。

“图表个数很多”相对电脑端一般需要十来个图表以上,相对手机端则个位数也会体现出差异。占对于图表个数达到 100 个这样比较极端的情况,Canvas 的内存占用量相比 SVG 可以达到十倍以上。

当你感觉到滚动屏幕页面卡顿时,可能是因为内存占用较多引起的,这时候可以考虑使用 SVG 渲染。

导出小文件高清晰时使用 SVG

SVG 渲染导出的 SVG 文件更小,却可以保持矢量无限清晰放大。我们接到用户反馈经常有在 PDF 中插入图表的需求,这时如果插入 SVG,不仅可以使图片更清晰,也可以使 PDF 的尺寸更小。

对于设计师而言,也可以使用导出的 SVG 进行二次编辑。

部分特殊渲染效果只有 Canvas 支持

除了某些特殊的渲染可能依赖 Canvas:如炫光尾迹特效、带有混合效果的热力图等,绝大部分功能 SVG 都是支持的。此外,目前的 SVG 版中,富文本、材质功能尚未实现。

炫光尾迹特效:

带有混合效果的热力图:

数据量特别大时推荐使用 Canvas 渲染

如果数据量比较大(>1000)、和大量图形高频率交互时,推荐使用 Canvas 渲染。搭配使用 ECharts 4.0 推出的渐进式渲染,可以有更好的性能表现。

如何指定以 Canvas 或 SVG 渲染

ECharts 默认使用 Canvas 渲染。如果想使用 SVG 渲染,ECharts 代码中须包括有 SVG 渲染器模块。

  • ECharts 的 预构建文件 中,常用版 和 完整版 已经包含了 SVG 渲染器,可直接使用。而 精简版 没有包括。
  • 如果 在线自定义构建 ECharts,则需要勾上页面下方的 “SVG 渲染”。
  • 如果 线下自定义构建 ECharts,则须引入 SVG 渲染器模块,即:
import 'zrender/lib/svg/svg';
复制代码

然后,我们就可以在代码中,初始化图表实例时,传入参数 选择渲染器类型:

// 使用 Canvas 渲染器(默认)
var chart = echarts.init(containerDom, null, {renderer: 'canvas'});
// 等价于:
var chart = echarts.init(containerDom);// 使用 SVG 渲染器
var chart = echarts.init(containerDom, null, {renderer: 'svg'});
复制代码

是不是特别简单呀?赶紧用起来吧~\(^o^)/~

Canvas or SVG?一张好图,两手准备,就在 ECharts 4.0相关推荐

  1. Canvas VS . SVG

    SVG SVG 是一种使用 XML 描述 2D 图形的语言. SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的.您可以为某个元素附加 JavaScript 事件处理器. 在 SV ...

  2. HTML5 Canvas vs. SVG vs. div

    本文翻译自:HTML5 Canvas vs. SVG vs. div What is the best approach for creating elements on the fly and be ...

  3. canvas webGL SVG 比较

    https://blog.csdn.net/Thea12138/article/details/79723380 对每个类型的封装库:https://blog.csdn.net/u010513603/ ...

  4. HTML5的图像系统Canvas与SVG

    在HTML5之前,没有标准的提供可供Javascript脚本调用的图像系统,以前的做法通常是通过Div来画点.线.矩形这种非常"笨"的办法来变相的绘图,虽然很"笨&quo ...

  5. 前端4-2-10:Canvas与SVG之简介、对比总结

    目录 [先言] [题外话] [问题] 1.定义 关于SVG(详见什么是SVG) 关于Canvas 2.两者区别 Canvas SVG 对比列表 3.历史 4.功能 5.技术 [先言] [题外话] 本来 ...

  6. WebGL、canvas、svg

    文章目录 WebGL.canvas.svg 面试题 canvas 面试题 canvas位图和svg矢量图的区别 canvas的绘图原理 canvas.style.width和canvas.width区 ...

  7. Canvas、 SVG 和 WebGl三者之间的区别

    概要: Canvas 位图,是需要自己画点的白板: SVG 矢量图,是给数据就可以绘制点.线.图形的,基于 XML 的标记语言: WebGL 3D位图,是基于 Canvas 的 3D 框架.   说明 ...

  8. Canvas做股票数据走势图实践分享(一)

    Canvas做股票数据走势图实践分享(一) 转载于:https://www.cnblogs.com/zhujiabin/p/4774142.html

  9. SVG与UML图详解

    一.SVG 可缩放矢量图形(SVG)是W3C的推荐标准,它使用XML描述两维图形结构和图形应用,可以在Web浏览器.手持设备或移动电话等多种上显示.目前稳定版本为1.1版,最新的版本是以草案形式存在的 ...

最新文章

  1. 在2020年,你觉得计算机视觉有哪些值得研究的领域?
  2. 深度学习(二十二)Dropout浅层理解
  3. 学生查询成绩登录2021高考查分,2021学情达成绩查询登录app
  4. Android 开机自动运行和添加删除桌面快捷方式
  5. 解析xlsx与xls--使用2012poi.jar
  6. ADO.NET与抽水的故事 系列三——抽水机—Command
  7. 如何制作毕业地图分布图_最简单的数据地图制作,一共6步搞定!
  8. c语言库用不用下载杀毒软件,开源杀毒软件ClamAV需要你的支持和帮助
  9. 计算机只能在安全模式下起动,电脑不能进入正常的XP系统,只能在安全模式下启动?...
  10. Chrome调试骚操作
  11. filezilla删除服务器文件,FileZilla的设置FTP服务器
  12. python读取json数据的key值_jquery中怎么获取json的key值?
  13. 大写金额用计算机简单些,Excel如何将较小的金额转换为大写金额?
  14. 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 8月14日
  15. 用传递函数求电路的频率特性
  16. abaqus对应python版本_Python:用不同版本的numpy覆盖从Abaqus导入numpy
  17. 奇点云数据中台技术汇 | 数据智能模型——数据中台航母的作战集群
  18. Go语言web框架——Gin
  19. 【JVM笔记】浅堆(Shollow Heap)与深堆(Retained Heap)
  20. ImToken被反编译,你的钱包安全吗?

热门文章

  1. 【NLP】毕设学习笔记(七)前馈神经网络代表者——卷积神经网络无公式理解
  2. 跟熊浩学沟通30讲读后感_怎样提高自己的沟通表达能力
  3. lm723大电流可调电源电路图_三端稳压模块LM338组成的高精度大电流可调稳压电源,电流可到达5A...
  4. 用硬盘安装linux物理机,老爷机安装UBUNTU的悲剧之旅(附用GRUB2硬盘安装ubuntu教程)...
  5. android 组件化_你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转...
  6. python isinstance_Python之isinstance | 学步园
  7. 顺序栈的基本操作c语言源代码,顺序栈的栈基本操作(C语言版)
  8. python计算累计收益率的函数,在Python中计算累积密度函数的导数
  9. 美国留学计算机网络技术,美国留学计算机专业详解
  10. mysql数据库是下面哪种类型的数据库_SQL数据库 选择哪个类型的数据库?