2009-02-27 21 views
2

Core Animationがドキュメンテーションに記載されているように、アニメーションを個別のスレッドで送出していることに気付いています。それにもかかわらず、私のアニメーションは私の主なスレッドをブロックしているようです。すべてのアニメーションが始まり、フィンランド語です。 (kCATransactionDisableActionsをtrueに設定してもしなくても)跳ね上がり、メインrunloopが停止します。Core Animationがメインスレッドをブロックしないようにするにはどうすればよいですか?

私は間違っていますか?

概念例:あなたがアニメーションに私はあなたがシステムを圧倒している想像1秒間に30回を開始していることを考えると

[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

答えて

7

30の新しいアニメーションを作成することは、Core Animationの使用方法ではなく、実際には悪い考えです。 Core Animationは、レイヤー(またはレイヤーバックビュー)をどこにしたいかをシステムに指示し、残りのフレーム、つまり時間枠内でアニメーションを実行するためにドロップするフレーム数提供する。アニメーション自体はバックグラウンドスレッドで実行されますが、私は最初に実行する必要のある小さな設定があると思います。これは、呼び出し元のスレッド(通常はメインスレッド)で行われます。この設定は、1/30秒よりも長くかかります。これはメインスレッドに負荷をかけます。

コアアニメーションとのやりとりを最小限に抑えることが目標です。複雑でスクリプト化されたモーションパス(またはその他のプロパティの変更)がある場合は、CAKeyframeAnimationを使用して事前にすべて設定し、そのアニメーションを一度呼び出すだけです。ユーザーの入力に応答して変更する必要のあるオブジェクトの動きについて何かがある場合は、実際の入力を取得したときにのみ行います。 CALayerの中間アニメーションのプロパティを変更すると、現在のモーションパスの途中から新しいデスティネーションに円滑に移動します。

コアアニメーションをこのように使用すると、iPhone上で60 FPSで最大50個の移動する半透明レイヤーを同時にアニメーションできます。

1

。以前のアニメーションにも新しいものを発行する前に開始する時間がありますか?

+0

あります。彼らはすべて始まり、フィンランド語です。 (kCATransactionDisableActionsをtrueに設定してもしなくても) それにもかかわらず、Core Animationは私のメインrunloopをブロックしてはいけません。 – Kriem

+0

CAが圧倒されると、メインループが実際にブロックされる可能性があります。スレッドは、無限のリソースを持つ魔法のものではありません。 –

関連する問題