2010-11-21 5 views
3

私はメディア中心のアプリのような雑誌のアニメーションメソッドをテストしています。私の目標は、ビデオ再生 Core Animationアプリケーションの最適化方法の提案はありますか?

  • とアニメーション画面の上に標準のUIオーバーレイとスプライト
  • の何百もの

    • 滑らかなアニメーションです。

    私はCore AnimationまたはOpenGLを検討しています。

    OpenGLは確かに高速ですが、私が知っているように、GLスプライト内でのビデオ再生の統合は不可能です。 (ビデオテクスチャにビデオが必要です)

    私はCore Animationを掘り下げています。しかし、パフォーマンスは悪かったです。私は、11x10px、アルファブレンドビットマップスプライトの256で単純な重力シミュレーションを試みました。そして、私はたったの約

    • 10 fpsの
    • 5%のデバイス利用
    • 5%レンダラ利用
    • 0%タイラの利用率を得ました。

    ボトルネックは明らかにCPUコード上にあります。

    私が知っているように、CAは合成のためにGLを使用しています。ちょっと小さなビットマップを使用しました。だからこの結果は不合理です。 CAフレームワーク自体に大きなオーバーヘッドがありますが、私はそれがどこにあるのか、どのように修正するのか分かりません。

    私は最適化を試しました。しかし、いくつかの選択肢しかありませんでした。明示的なトランザクションを試し、すべての補間を削除しました。しかし、パフォーマンスは良くなりませんでした。明示的なアニメーションを試しましたが、その動作を理解することは難しかったです。たぶんボトルネックがあります。

    最適化方法の提案はありますか?ここで

    は私のティッキングソースコードは次のとおりです。(CADisplayLinkと呼ばれるダニ):

    - (void)tick 
    { 
    [CATransaction begin]; 
    [CATransaction setAnimationDuration:0.0f]; 
    
    CGRect bounds = [hostLayer bounds]; 
    CGFloat gravity = +9.8f * 0.1f; 
    
    for (TestParticleSprite *tspr in spriteLayers) 
    { 
        CGSize mtn = [tspr motion]; 
        CGPoint ctr = [tspr position]; 
    
        mtn.height += gravity; 
        ctr.x += mtn.width; 
        ctr.y += mtn.height; 
    
        CGFloat over = ctr.y - bounds.size.height; 
        if (over > 0.0f) 
        { 
        // Hit the ground! 
        ctr.y = bounds.size.height - over; // Bounce. 
        mtn.height *= -1.0f;  // Bounce. 
    // mtn.width *= 0.95f;  // Lose energy. 
    // mtn.height *= 0.95f;  // Lose energy. 
        } 
    
        [tspr setMotion:mtn]; 
        [tspr setPosition:ctr]; 
        [tspr removeAllAnimations]; 
    
    // // Tried explicit animation, but it was unable to make it work. 
    // CATransform3D t = CATransform3DMakeTranslation(ctr.x, ctr.y, 0.0f); 
    // CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"]; 
    // [anim setAdditive:NO]; 
    // [anim setCumulative:NO]; 
    //// [anim setFromValue:[NSValue valueWithCATransform3D:t]]; 
    // [anim setToValue:[NSValue valueWithCATransform3D:t]]; 
    // [tspr addAnimation:anim forKey:nil]; 
    } 
    
    [CATransaction commit]; 
    } 
    
  • 答えて

    1

    はシャーク(CHUDツールの一部)の下であなたのコードを実行し、ほとんどの時間が費やされている場所を確認 - そのはず最適化の取り組みをどこに集中させるかという手がかりを与えます。

    +0

    ありがとうございました。しかし、問題は私がどこで解決しなければならないか分からないことです。私は自分の知識の中ですべての方法を試しました。だから私はいくつかの追加の最適化方法を尋ねています:)(私の不明な質問には申し訳ありません) – Eonil

    +0

    @ Eonil:Sharkのコードをプロファイリングすることの全ポイントは、 "ホットスポット"を特定することです - なぜあなたのコードが十分に速く動いていないのかを理解することができます。そのコードの高価な部分だけを最適化するための具体的な質問をすることができます。 –

    関連する問題