2017-05-30 2 views
0

大量(数百)の不透明度を小さなアニメーションにアニメーション化するにはいくつかの問題がありました。CALayers私はCore Animationを使用していましたが、これを改善するためにはCVDisplayLinkを使用しました。何百ものCALayersのアニメーションのパフォーマンスは階層によって変化します

これらのレイヤーをすべて分離して不透明度をアニメーション化すると、パフォーマンスが非常に悪くなることがわかりました。 1つのより大きな含む層に

for layer in layersToAnimateIn { 
    layer.opacity = newOpacity 
} 

はすべて、これらの層を移動し、その不透明度をアニメーション化することは非常に良く扱うようだ:表示更新コードでは、私は単純にするだろう。パフォーマンスはそれほど劇的に変化する理由

私はそれぞれの場合に層の同じ量を扱っていて、視覚的な効果は同じであるので
containingLayer.opacity = newOpacity 

、誰かが説明できますか?システムは明らかに私がスクリーンリフレッシュごとに何百ものレイヤーの不透明度を変えることを問題にしています。

答えて

1

レイヤーツリーを変更するたびにパフォーマンスコストが発生します.1つのトランザクションで変更するレイヤーが多いほど、CAはデータモデルを通過してデータモデルを更新するために多くの作業を行う必要があります。すべてを同じ不透明度に変更している場合は、着陸したアプローチが適切です。スーパーレイヤーの不透明度を変更するだけです。

複数のレイヤプロパティを一度に異なる値に設定する必要がある場合は、暗黙的なアニメーションを無効にする必要があります。そうしないと、各レイヤの変更されたプロパティごとに自動アニメーションが生成されますそれ自身のコスト。これは、タイマーやディスプレイリンクからプロパティを設定するときに特に重要です。プロパティを1秒間に30回設定すると、その時間に30個のアニメーションが作成されます。これは...いいことではありません少なくとも。暗黙的なアニメーションを無効にするには、次のようにトランザクション内のプロパティを設定する場所にコードをラップします。

CATransaction.begin() 
CATransaction.setDisableActions(true) 
    for layer in layersToAnimateIn { 
     // … 
    } 
CATransaction.commit() 
+0

洞察に感謝、ノア。暗黙的なアニメーションについての良い点は、私はそれをスキップしました。興味深いことに、私がそれらを無効にしたとき、パフォーマンスはほぼ同じままでした。最初に述べたように、問題はデータモデル側と関係している必要があります。 – Ricky

関連する問題