2010-07-22 101 views
3

我有一個循環每秒觸發一次函數30次。該函數改變了我用於動畫的幾個點的位置。我通過所有的點畫線,這意味着線將每秒改變30次。優化核心圖形動畫(iPhone)

我將這些行繪製到CGLayer,然後在drawRect:方法中繪製到UIView。我這樣做是因爲我明白,在畫外屏時性能得到了改善。但是,CGLayer似乎保存了所有實際行而不是繪製像素,因爲即使清除了它,隨着時間的推移,程序運行速度也會越來越慢,因爲繪製的線越多。

我要求其他方法來動畫這個。什麼是最有效的方式,爲什麼?

回答

4

您應該使用Core Animation框架來爲圖層上的屬性設置動畫效果。您可以繼承CALayer的子類或使用委託來執行實際繪圖。在繪圖代碼中,您可以訪問正在插值的屬性,並使用它來移動點,更改線條粗細或Core Graphics允許您控制的任何其他屬性。查看this example code from Apple並查看它如何使用正在動畫的lineWidth值。

This little tutorial by John Blackburn是我最喜愛的Core Animation介紹之一。有幾個不同的概念需要掌握,但通常創建相當複雜的動畫非常簡單。

對於運行速度較慢,速度較慢的事情,您的問題最有可能與Core Graphics無關。例如,你可能意外地創造了越來越多的計時器。

+0

謝謝!運行速度較慢的問題是我正在繪製一個不是位圖的上下文,而是將所有行保存爲實際行,這使得舊行不顯示繪製。然而,繪製到位圖上下文使其工作。 我會檢查你發送的教程,謝謝! :) – Accatyyc 2010-07-22 20:19:56

4

如果你有一個需要在各州之間進行動畫處理的路徑,我強烈建議你看看CAShapeLayer。此圖層類型允許您指定兩條路徑(具有相同數量的控制點),並使用Core Animation在它們之間平滑地進行動畫處理。

關於這個問題的兩篇好文章是Matt Long的"Marching Ants With Core Animation"和Joe Ricioppo的"Complex Interpolation with CAShapeLayer (Free)"

如果您改爲使圖片的某些部分保持不變,並且您只需要將新元素合成在其上,那麼我建議將圖片的一部分繪製到靜態CALayers或UIViews中,然後添加新視圖最重要的是改變的部分。合成圖層比重繪視圖或圖層的內容要快得多。

+0

謝謝!有時間瞭解合成。 – Accatyyc 2010-07-22 20:20:32