2010-07-13 49 views
2

我正在使用UIView動畫塊爲顯示器上多個圖層上的CALayer屬性(本例中爲backgroundColor)設置動畫。同時對CALayer屬性動畫數量有合理預期?

所有層是不透明的,而我在一個塊動畫的一切,基本上是這樣的

[UIView beginAnimations:@"outer" context:nil]; 
float duration = .25; 
float offset = 0.0; 
for(NSArray *viewsInPass in viewQueue) { 
    for(UIView *innerView in viewInPass) { 
     [UIView beginAnimations:@"inner" context:nil]; 
     [UIView setAnimationDelay:offset]; 
     [UIView setAnimationDuration:duration]; 
     [innerView.layer setBackgroundColor:[newColor CGColog]]; 
     [UIView commitAnimations]; 
    } 
    offset += duration; 
} 
[UIView commitAnimations]; 

一旦有4-5個併發層動畫的背景顏色也變得非常不連貫,基本上啓動設備完全忽略了渲染速率,只是凍結到剩餘動畫的結尾。所有的視圖不重疊,它們都是不透明的,一般約20x20像素。

我對這種非高性能有些震驚,特別是在閱讀了Quartz 2D等許多令人欣喜的事情之後。我覺得我必須在這裏錯過一些基本的東西!

幫助!

回答

1

事實證明,問題在於,您需要在開始的偏移量之間添加某種類型的epsilon。你最終會在每次通過的尾部和下一次開始的時候進行n * 2動畫。出於某種原因,這使得動畫系統barf,即使它只是一個他們分享的處理片。

使之成爲

offset + = duration * 1.05;

解決了堵塞動畫的通路之間的匆忙。

2

視圖中的不透明度是一個最大的性能影響 - 如果您可以避免它們在整個呈現過程中重疊並且完全不透明(即,在視圖序列中的任何位置都沒有透明度,包括背景),您會輕微獲得更好的表演。

我設法以〜30 fps(即整個屏幕)獲得單個大型動畫,但遇到內存限制(原始iPhone/iPod),最終導致我在此之外殺死了我。如果你想獲得的不僅僅是你到達的地方,還需要通過遊戲框架或直接進入OpenGL的土地。 Objective-C的開銷在該循環中調用,以便在您騎車通過圖像的同時更改偏移量,最終會導致您失敗。

1

編輯:[刪除]

既然你有每個動畫開始與前一個結束,你可以在一個NSTimer或委託didFinish回調而不是一次排隊的所有動畫開始每次。這會對動畫系統的需求減少。

您應該嘗試確保沒有視圖在同一時間以不同的顏色排隊。

+1

其實這是不正確的。 CAAnimation有一個事務模型,並且事務嵌套,因此它將具有不同開始時間的所有動畫排隊到同一個動畫事務中。如果不這樣做,由於所有的動畫調度開銷,性能會更差。 我已經嘗試過單獨做每個傳遞,並讓每個動畫獨立運行在它自己的事務中,並且它有各種各樣的問題。由於調度抖動較小,NSTimers導致動畫相位不匹配。 animationsDidFinish最終沒有幫助,除了一個額外的選擇器調用。 – groundhog 2010-07-13 11:59:32

+0

如果您的觀點不具有互動性,那麼在單一視圖中轉移到CALayers會有所幫助。 – drawnonward 2010-07-13 16:32:33