修訂問題 我已經更新了這一點更簡潔..:到〜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