修订问题 我已经更新了这一点更简洁..:到〜3000拉斐尔对象一次顺利动画属性发生变化
在这种提琴:http://jsfiddle.net/pX2Xb/4/我有借鉴一些3000拉斐尔代码圈到页面。然后尝试在10秒内一次对所有圆圈进行动画处理(更改填充颜色),这会产生笨重的视觉动画。将圆圈数量更改为20以查看比较平滑的动画。
我的问题是(a)是否有可能对3000个元素进行更新,并且(b)如果是,那么代码的做法是什么?
一些注意事项:
- 我愿意拿小定时打,如果有一些方法来解决这个优化,但是,例如,我想所有界至少已经更新无论动画时间设置为1.5倍。所以,如果动画是10秒,所有圈子应该已经改变了15.
- 3000个元素大致是我目前的限制,所以我会很高兴它为此工作:)在说,如果解决方案可以有效地处理更多的事情,对于一般情况来说,这真的很棒。
旧的细节,在情况下,它可以帮助
我创建一个大图美县,其中有超过3000的;我使用this Wikipedia svg file来获取相关的SVG路径来创建地图,并使用RaphaelJs来渲染地图。
因此,我结束了类似下面的3000语句:
var cc_02130 = rsr.path("M 140.66674,.... 320.11635"); // county path
cc_02130.attr({id: '02130',.. .."marker-start": 'none'}); // init attrs
我也创造了Paper.set()
对象来保存所有这些元素:
var myset = paper.set([cc_56039, cc_56040, cc_56041 ...])
忘记了在这里实际生成的文件非常大,我非常感谢的建议,我可以如何将更改应用到上面详述的对象的体积,这既快又合理确定CPU聪明 (可能是一个很大的问题)。
我绝对会改变我的代码/对象的结构,只要我可以单独更改特定县的属性。 例如,我希望能够在一秒或两次(全部3000+)中为每个路径内容应用不同的颜色。
我面临的挑战不是如何应用颜色变化,动画等,而是如何快速高效地完成这一任务。现在,如果我循环并对3000多个对象应用更改,我的机器就会尖叫我;作为替代方案,我使用setTimeout
将更改分解为更小的块(也许10个一次,延迟40 ms)。超过3000个项目,这变得很慢,并仍然使用大量的CPU。
感谢, OLI
我的猜测是,你的延迟来自你更新对象触发的大量重绘,而不是从对象本身的变化触发。即使在慢速机器上,3000个函数调用也应该在一秒钟内完成。你可以衡量一下,如果你触发了每次更改的重绘? 如果是,请查看是否有方法在重绘之前阻止重绘或批量更新。 – Munter
我同意@Munter - 我现在明白我的问题是关于所有这些形状的实际重绘/渲染,而不是实际的函数调用。考虑到这一点,我仍然在某种程度上确保我能够改善_this_问题。相应地更新我的问题。 – oli
如果您有能力损失非svg浏览器,那么您的问题更适合d3.js。这里是你的jsfiddle由d3处理的动画:http://jsfiddle.net/ekMd6/ – Duopixel