[英]How to speed up the force layout animation in d3.js
我使用D3.js渲染大约500个节点和它们之间的链接。 通常需要10秒才能使布局稳定下来(迭代收敛)。
如何加速整个过程,比如节点在动画过程中移动速度提高了2倍。 那么时间将是50%(用于迭代的CPU时间应该远小于10秒,但我怎样才能减少动画时间)。
我试过了:
有什么建议? 谢谢。
查看此主题 ,其中包含许多与此主题相关的良好信息。
您可能尝试实现的该线程的一个建议是在单个requestAnimationFrame
回调中多次调用force.tick()
,然后更新节点和链接位置,然后循环直到force.alpha
达到0(或者您想要的任何内容) alpha阈值为)。 尝试这样的事情:
var ticksPerRender = 3;
requestAnimationFrame(function render() {
for (var i = 0; i < ticksPerRender; i++) {
force.tick();
}
// UPDATE NODE AND LINK POSITIONS HERE
if (force.alpha() > 0) {
requestAnimationFrame(render);
}
});
这将为每3个刻度或3倍速度渲染一次。 根据需要调整ticksPerRender
值。
这是一个简单的演示。 在这种情况下,我使用force.on('start', callback)
来调用上面描述的渲染逻辑。 这意味着在开始拖动交互时会自动再次调用它。
在ticked事件处理程序中注入一个调用/调用可能会更好,requestAnimationFrame方法会在触摸板环境的MacBook上引起一个奇怪的错误。
function ticked() {
for (let i = 0; i < 5; i++) {
force.tick();
}
link.attr('x1', (d) => d.source.x)
.attr('y1', (d) => d.source.y)
.attr('x2', (d) => d.target.x)
.attr('y2', (d) => d.target.y);
node.attr('transform', (d) => `translate(${d.x}, ${d.y})`);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.