过去一段时间曾两次使用了 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(); // 渲染完成后立即停止刷新
}
});

这样修改之后,一个上万节点的图,通常在几秒内就可以绘制完成了。比如出这么个图,几秒钟就搞定了。

最新文章

  1. C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)
  2. Orchard 微软CMS项目介绍
  3. 用户图形界面(GUI)学习笔记(一)——Swing与AWT
  4. HDFS源码分析:NameNode相关的数据结构
  5. LINQ to SQL更新数据库操作(转载)
  6. CRF++中文分词使用指南
  7. apiCode/1/1.1/1.1.1
  8. OpenCV中的常用函数
  9. BZOJ 1620: [Usaco2008 Nov]Time Management 时间管理
  10. 【HDOJ】2451 Simple Addition Expression
  11. jdk8新特性之lambda expressions
  12. swift 实现漂亮的粒子效果CAEmitterLayer
  13. Android学习笔记--AlertDialog应用
  14. vscode中使用markdown
  15. Spring之旅第六篇-事务管理
  16. Django model中的class Meta详解
  17. Android 右上角菜单栏
  18. Vector 是线程安全的,是不是在多线程下操作Vector就可以不用加Synchronized
  19. python 全栈开发,Day10(动态参数,命名空间,作用域,函数嵌套)
  20. 使用ServiceDesk Plus保证及时解决问题,防止违反SLA

热门文章

  1. 安装 composer SSL operation failed with code 1
  2. perl小记
  3. 管理权限&lt;八&gt;
  4. bugly使用
  5. freeCodeCamp:Factorialize a Number
  6. 国内从事GIS行业的公司及其网址
  7. C语言误区
  8. 数据库知识整理&lt;六&gt;
  9. vpn与局域网冲突解决方案
  10. IQueryable和IQueryProvider初尝