提高D3js力导向图加载速度(转)

过去一段时间曾两次使用了 D3 力导向图来描绘族群关系。
http://bl.ocks.org/mbostock/1062288
第一次用的时候不求甚解,交差了事。当时点也不多,很顺利完成了任务。这一次确不同,每个图里要渲染的有成千上万个点,每次渲染都死慢死慢,一大堆点动来动去,动半天才稳定下来,这一晃几分钟过去了。
阅读了一下官方文档 ,发现问题出来 tick 上。
force.start() 后,有一个计时器不停地触发 tick 直到所有节点最终受力平衡稳定下来。
可以理解为,有个计时器不停在打点,每打一次点需要触发一次 tick() 里的动作。而 tick() 的默认动作是重绘所有节点和连线位置。因为图形渲染需要时间长,渲染的次数又多,所以需要等很长时间。
function tick() {
  link.attr("x1", function(d) { return d.source.x; })
      .attr("y1", function(d) { return d.source.y; })
      .attr("x2", function(d) { return d.target.x; })
      .attr("y2", function(d) { return d.target.y; });
  node.attr("cx", function(d) { return d.x; })
      .attr("cy", function(d) { return d.y; });
}怎样加快出图的速度呢?或者说,能不能不看中间复杂的变化过程,只看最终稳定的结果?
从官方文档里查到 alpha 参数。这个值最开始是 1,随着图形趋于稳定,它也会逐渐趋近 0。
force.alpha([value])
Gets or sets the force layout's cooling parameter, alpha. If value is specified, sets alpha to the specified value and returns the force layout. If value is greater than zero, this method also restarts the force layout if it is not already running, dispatching a "start" event and enabling the tick timer. If value is nonpositive, and the force layout is running, this method stops the force layout on the next tick and dispatches an "end" event. If value is not specified, this
method returns the current alpha value.
于是,对原来的代码稍作修改:
force.on("tick", function () {
    if(force.alpha()<=0.05){  // 足够稳定时,才渲染一次
      link.attr("x1", function (d) { return d.source.x; })
          .attr("y1", function (d) { return d.source.y; })
          .attr("x2", function (d) { return d.target.x; })
          .attr("y2", function (d) { return d.target.y; });
      node.attr("cx", function (d) { return d.x; })
          .attr("cy", function (d) { return d.y; });
      force.stop(); // 渲染完成后立即停止刷新
    }
});这样修改之后,一个上万节点的图,通常在几秒内就可以绘制完成了。比如出这么个图,几秒钟就搞定了。

提高D3js力导向图加载速度(转)的更多相关文章
- 精简CSS代码,提高代码的可读性和加载速度
		前言 提高网站整体加载速度的一个重要手段就是提高代码文件的网络传输速度.之前提到过,所有的代码文件都应该是经过压缩了的,这可提高网络传输速度,提高性能.除了压缩代码之外,精简代码也是一种减小代码文件大 ... 
- 如何提高cocos2d-x-spine骨骼动画加载速度
		下面分2点来说: 1. 时间消耗点:io和现场解析 解决方案:加载过的骨骼动画就不要每次重新加载,不要每次都去加载json文件和atlas,我推荐使用 static CCSkeletonAnimati ... 
- 在windows、linux中开启nginx的Gzip压缩大大提高页面、图片加载速度<转>
		为了降低tomcat服务的压力,把页面上的图片采用windows版的nginx进行加载,由于有些图片比较大,加载特别的慢,所以在nginx中打开了gzip的压缩功能.加载图片的速度快了很多. 通过站长 ... 
- 提高首屏页面加载速度,解决vue-cli打包后单个文件过大的问题
		本教程是针对vue-cli3以上的版本,其实原理都大同小异,这个demo为vue-cli直接创建的项目,并在main.js中引入了echart.element-ui.lodash 首先看demo打包后 ... 
- phar缓存 编译缓存 提高phar文件包加载速度
		phar文件可以把用到的PHP文件全部打包在一个文件中,十分方便网站部署.但是单个的PHP文件可以使用opcache缓存(字节码缓存),以提升PHP的运行速度.那么PHAR文件包如何使用缓存呢. 这里 ... 
- 提高docker加载速度
		由于国情,我们需要对配置一下docker的下载镜像,提高一下后续的加载速度. 使用vim编辑 /etc/docker/daemon.json, 增加如下内容. { "registry-mir ... 
- Web前段优化,提高加载速度 css
		前言: 在同样的网络环境下,两个同样能满足你的需求的网站,一个"Duang"的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒, ... 
- jQuery实现图片预加载提高页面加载速度和用户体验
		我们在做网站的时候经常会遇到这样的问题:一个页面有大量的图片导致页面加载速度缓慢,经常会出现一个白页用户体验很不好.那么如何解决这个问题呢?首先我们会想到的是提高服务器性能,使用静态缓存等手段来加快图 ... 
- 对WEB标准以及W3C的理解与认识 - 提高网页加载速度
		在写代码的时候应该注意: 1.标签闭合 2.标签小写 3.不能随意嵌套 提高被搜索引擎搜到几率: mate中的name变量[其中keywords和description尤其重要] Meta name= ... 
随机推荐
- Sql 常见面试题
			SQL面试题(1) create table testtable1(id int IDENTITY,department varchar(12) ) select * from testtable1i ... 
- Jquery点击发送按钮后,按钮文本倒计时
			1.html代码 <input type="number" id="mobileNo" placeholder="请输入手机号" /& ... 
- Big Number--hdu1018(数学)
			http://acm.hdu.edu.cn/showproblem.php?pid=1018 题目大意 : 求一个数的阶乘的位数 公式log10(n!)=log10(1)+log10(2)+log1 ... 
- utime函数
			utime函数:对一个文件的访问和修改时间 #include <utime.h> int utime( const char *pathname, const struct utimbuf ... 
- 【原创】--  uboot,kennel,fs,rootfs 编译制作
			环境:ubuntu14.04 内核版本 linux 3.13.0 OK6410 内核编译环境 linux 3.0.1 uboot版本 1.1.6 交叉编译工具链 arm-lin ... 
- 【转载】-- vi/vim使用
			vi/vim 基本使用方法本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了!i/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所 ... 
- (原创)学习MCU的感悟_初级(MCU,经验)
			1.Abstract 想了许多,不知道怎么开始,这算是学习和应用MCU的第四个年头了:过程虽然坎坎坷坷,但仍然还是坚持到了今天,也总算是折腾入行了.为了写的还是能够读下去,还特意写了一个小提纲 ... 
- JAVA+HTML
			1.采用轻量级 JApplet . import java.awt.*; import javax.swing.JApplet; public class test extends JApplet{ ... 
- ORA-30004 错误处理
			一.问题情景: 原SQL: select c.CATEGORY_ID, c.CATEGORY_NAME, SYS_CONNECT_BY_PATH(c.CATEGORY_NAME ... 
- Json.Net4.5 序列化问题
			1.子类序列化 依赖父类属性 [DataContract] public class pcc { [DataMember] public string Name { get; set; } } pub ... 
