【发布时间】:2015-10-29 22:31:42
【问题描述】:
我们在一个网络应用程序上使用d3.layout.force,我一直在调查一个错误报告,它在 Android 上运行缓慢:与在桌面浏览器上的工作方式相比,感觉节点处于油中,或 iOS。
(顺便说一句,我们只有 4 到 9 个节点,而 4 到 9 之间的缓慢感觉并没有什么不同。)
我们设置size()、linkDistance()和charge();所以我们使用摩擦力、θ、阿尔法、重力等的默认值。我用这些进行了试验,试图在桌面上重现效果,但不能。 (friction(0.67),而不是默认的 0.9,是最接近的,但不知何故仍然感觉不同。)
然后我设置了一个 FPS 计(基于对 tick() 函数的调用)。我们在台式机上获得 60 fps,在 ipad 上似乎是 40 和 50 年代。但在 Android Chrome(在 Nexus 7 上)上,它的上限似乎为 30fps,而且通常只有一半。 Android Firefox 通常是 20 多岁,但有时会进入 30 多岁。
那么,Android 设备只是速度较慢是一个合理的假设吗? Android Chrome 会不会有 30fps 的上限?
那我该如何解决呢?我相信 d3.js 使用requestAnimationFrame()。通常动画库在调用requestAnimationFrame() 之间需要时间来决定将对象移动多远(因此,当 CPU 过载时,动画会变得更加抖动,但需要相同的时间才能完成)。但似乎 d3.js 并没有这样做,而是按刻度移动所有内容,而不是按经过的时间。我该怎么办?
(理想情况下,我想要一个基于机器的慢/快的解决方案,而不是必须嗅探浏览器。)
【问题讨论】:
-
This question 和 this question 可能会有所帮助。
-
@LarsKotthoff 谢谢。我只有几个节点(刚刚更新了问题)。我将在第一个链接中尝试使用
requestAnimationFrame()向tick()添加更多调用...所以看看会发生什么会很有趣。
标签: android d3.js force-layout