2009-02-27 66 views
2

我知道Core Animation在單獨的線程中調度它的動畫,正如文檔中所述。不過,我的動畫似乎阻止了我的主線。所有動畫開始和芬蘭語。 (有或沒有kCATransactionDisableActions設置爲true),但變得跳躍,主runloop攤位。如何防止Core Animation阻止我的主線程?

我在做什麼錯?

概念例如:

[NSTimer scheduledTimerWithTimeInterval:0.0333 target:self selector:@selector(gameEngine) userInfo:nil repeats:YES]; 

- (void)gameEngine 
{  
    [CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 
    myLayer.position = CGPointMake(newX, newY); 
    [CATransaction commit];  
} 
+0

備案:我們正在潛入OpenGL ES。 – Kriem 2009-03-02 21:29:41

回答

7

每秒創建30個新動畫是一個非常糟糕的主意,而不是Core Animation如何使用。核心動畫是圍繞這樣的想法設計的,即你告訴系統你希望你的圖層(或圖層背景視圖)最終到達的位置,並且它會計算出剩下的部分,包括在你的時間範圍內放下多少幀來運行動畫提供。動畫本身將運行在後臺線程上,但我相信有一些設置需要首先在調用線程(通常是主線程)上執行。這種設置可能需要比1/30秒更長的時間,這會使主線程過載。

您的目標應該是儘量減少與Core Animation的交互量。如果您有一個複雜的腳本運動路徑(或其他屬性更改),請使用CAKeyframeAnimation提前完成設置,然後調用該動畫一次。如果您的對象的運動有些東西需要根據用戶輸入進行更改,那麼只有在獲得實際輸入時纔會這樣做。更改CALayer中間動畫的屬性將使其從當前運動路徑的中間平滑移動到新目標。

如果以這種方式使用Core Animation,則可以同時在iPhone上以60 FPS動畫顯示50個移動半透明層。

1

既然你已經開始了動畫30次我可以想象你在鋪天蓋地的系統。在發佈新動畫之前,以前的動畫是否有時間開始?

+0

他們這樣做。他們都開始芬蘭語。 (有或沒有將kCATransactionDisableActions設置爲true。) 儘管如此,Core Animation不應阻止我的主循環。 – Kriem 2009-02-27 18:40:34