我使用D3.js渲染大约500个节点和它们之间的链接.通常需要10秒才能使布局稳定下来(迭代收敛).
如何加速整个过程,比如节点在动画过程中移动速度提高了2倍.然后时间将是50%(用于迭代的CPU时间应远小于10秒,但我如何减少动画时间).
我试过了:
有什么建议?谢谢.
jsh*_*ley 18
查看此主题,其中包含许多与此主题相关的良好信息.
您可能尝试实现的该线程的一个建议是force.tick()在单个requestAnimationFrame回调中多次调用,然后更新节点和链接位置,然后循环直到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);
}
});
Run Code Online (Sandbox Code Playgroud)
这将为每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})`);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5597 次 |
| 最近记录: |