我正在try Select 正确的技术来更新一个项目,该项目基本上可以在可zoom 、可平移的图形中呈现数千个点.目前使用Protovis的实现表现不佳.点击此处查看:

http://www.planethunters.org/classify

当完全缩小时,大约有2000个点.try 使用底部的手柄放大一点,然后拖动它来平移.您会发现它非常不稳定,除非您有一台速度非常快的计算机,否则您的CPU使用率可能会在一个核心上达到100%.对焦点区域的每一次更改都需要重新绘制到Protovis,这非常慢,绘制的点越多,情况就越糟糕.

我想对界面做一些更新,并改变底层的可视化技术,使其对动画和交互更具响应性.从下面的文章看,似乎需要在另一个基于SVG的库和基于画布的库之间进行 Select :

http://www.sitepoint.com/how-to-choose-between-canvas-and-svg/

d3.js是从Protovis发展而来的,它是基于SVG的,是supposed to be better at rendering animations.然而,我对它有多好以及它的性能上限是多少持怀疑态度.出于这个原因,我还在考虑使用基于画布的库(如KineticJS)进行更全面的判断.然而,在我使用这样或那样的方法之前,我想听听曾经用这么多数据做过类似Web应用程序的人的意见.

最重要的是性能,其次是易于添加其他交互功能和编写动画.一次可能不会超过2000个点,每个点上都有那些小的误差条.Zooming in, out, and panning around need to be smooth.如果最新的SVG库在这方面做得不错,那么使用d3的易用性可能会超过KineticJS等增加的设置.但是,如果使用Canvas有巨大的性能优势,特别是对于计算机速度较慢的人,那么我肯定更喜欢这样做.

"纽约时报"制作的APP示例,使用SVG,但动画仍然流畅,效果可以接受: http://www.nytimes.com/interactive/2012/05/17/business/dealbook/how-the-facebook-offering-compares.html美元.如果我可以获得这样的性能,而不必编写自己的画布绘图代码,我可能会 Select SVG.

我注意到一些用户使用了d3.js manipulation combined with canvas rendering的混合版本.然而,我在网上找不到太多关于这篇文章的文档,也无法联系到这篇文章的作者.如果有人有过这种DOM到画布(democode)实现的经验,我也想听听你的意见.它似乎是一个很好的混合体,既能操作数据,又能对如何呈现数据(以及性能)进行自定义控制,但我想知道,将所有内容加载到DOM中是否仍然会降低速度.

我知道有一些现有的问题与这个问题类似,但没有一个问题是完全相同的.谢谢你的帮助.

Follow-up:我最终使用的实现是https://github.com/zooniverse/LightCurves

推荐答案

幸运的是,绘制2000个圆是一个非常容易测试的示例.下面是四个可能的实现,Canvas和SVG各两个:

这些示例使用D3的zoom behavior来实现zoom 和平移.除了圆是在Canvas中渲染还是在SVG中渲染之外,另一个主要区别是您使用的是geometriczoom 还是semanticzoom .

几何zoom 意味着将单个变换应用于整个视口:放大时,圆会变大.对比语义zoom 意味着您可以将变换单独应用于每个圆:放大时,圆的大小保持不变,但它们会展开.org目前使用语义zoom ,但考虑一下其他情况可能会很有用.

几何zoom 简化了实现:应用一次平移和zoom ,然后重新渲染所有圆.SVG实现特别简单,只需更新单个"转换"属性.这两个几何zoom 示例的性能感觉已经足够了.对于语义zoom ,您会注意到D3比Protovis要快得多.这是因为它 for each zoom 事件做的工作要少得多.(Protovis版本必须重新计算所有元素的所有属性.)基于画布的语义zoom 比SVG更灵活一些,但是SVG语义zoom 仍然感觉很灵敏.

Yet there is no magic bullet for performance, and these four possible approaches don't begin to cover the full space of possibilities.例如,您可以结合使用几何和语义zoom ,使用几何方法进行平移(更新"Transform"属性),并且在zoom 时仅重画单个圆.您甚至可以将这些技术中的一项或多项与CSS3转换结合起来,以添加一些硬件加速(如在hierarchical edge bundling example中一样),尽管这可能很难实现,并且可能会引入可视工件.

不过,我个人的偏好是keep as much in SVG as possible, and use Canvas only for the "inner loop" when rendering is the bottleneck.SVG为开发提供了很多便利,比如CSS、数据连接和元素判断器,因此从画布开始进行优化往往为时过早.将画布与SVG相结合,就像在您链接的Facebook IPO可视化中一样,是一种灵活的方式,可以在保持最佳性能的同时保留大部分这些便利.我在Cubism.js中也使用了这种技术,时间序列可视化的特例非常适合位图缓存.

如这些示例所示,您可以将D3与Canvas一起使用,即使D3的某些部分是特定于SVG的.另请参见这个force-directed graph和这个collision detection example.

Html相关问答推荐

谷歌翻译不适用于JPEG标签

如何将背景图像放置在窗口的最顶部?

打印pdf时100 vh迪夫有半页高

如何阻止Chromecast图标出现在HTML5视频

正文不能填满浏览器100%的高度

如何从卷轴中排除粘性元素?

R-markdown中的非顺序列表

根据按钮位置左/右对齐按钮

轨道上的居中范围滑块拇指(Webkit)

更改Angular 为17的material Select 字段的高度?

HTML中的ARIA标签:在元素内部还是外部?(&Q;

如何在r中提取明显非标准html标签的值

网页爬虫:使用时光机器进行数据采集

为什么我的 div 元素没有形成一个圆形时钟?

使用 calc 函数设置字体大小时 Flexbox 项目重叠

重点/主动输入的概述问题

如何从另一个 ng-template 获取输入值

本地 css 样式表未链接

shinydashboard 标题中的位置标题

Bootstrap 5 网格问题,div 向下转义