2011-01-31 13 views
7

私はいくつかのCALayersをUIViewのレイヤのサブレイヤとして追加しています。各レイヤーの内容は、サーバーからダウンロードされた別のイメージです。各レイヤーは、オフスクリーンからランダムに生成された位置にアニメーション化されます。画像データは非同期にダウンロードされます。各画像は約300x300以下です。CALayer最適化?

ランダム配置の結果、レイヤーが重なり、レイヤーの上にあるレイヤーによって不明瞭になります。これはすべていいです。

私はレイヤーが完全に見えなくなっているので、レイヤーを削除しています。the answer to this questionでの提案を使用して、レイヤーを削除しています。カバレッジを計算する計算は別のスレッドで行われます。

私はUIPanGestureRecognizerを使用して、ユーザーが画面上でレイヤーをドラッグできるようにしました。

追加されたレイヤーの数が25〜30に近づき、ますます悪化するとパフォーマンスに問題が発生します。アニメーションは不安定になり、しばしば完全に欠けています(新しく追加されたレイヤーは最終的な位置に表示されます)。また、パンのジェスチャは無視されるか、選択したレイヤーが不安定に再配置されます。

私は、すべてのレイヤーがオーバーラップし、もう1つのレイヤーがアニメーション化されているGPUを殺していると思いますか?

パフォーマンスを改善する方法についてのご意見はありますか?

多数のレイヤを処理するベストプラクティス?

レイヤーを以前に追加したレイヤーとは別のview.layerでアニメーションを開始する方がよいですか?

ありがとうございます!

答えて

4

すぐに確認できるカップルです。

Core Animation Instrumentを実行し、不透明度を探します。レイヤーの不透明フラグをYESに設定するだけでは不十分です。下層の画像にアルファ成分がある場合、レイヤーはこれを考慮に入れます。

サーバから取得したデータにアルファがある場合は、Quartzで再描画し、アルファを含まない新しいフォーマットでローカルに保存してください。

1メガピクセルの画像を100x100のタイルに入れないようにしてください。コアアニメーションインストゥルメント、「カラーミスアライン画像」をオンにして黄色を探します。

30〜50層は問題ありません。

+0

ありがとうございました。私はそれを撃つだろう。私はlayer.contents(レイヤーが描画されているときのみ使用されます)を提供するとき、不透明が無視されたという印象を受けました。アルファビットはもっと複雑になります。回転したエッジを滑らかにするために、画像のエッジの周りに2ピクセル幅の透明な境界線を使用しています。インストゥルメンツへ – TomH

+0

こんにちはTom - yepの不透明さは無視されます。描かなければ、UIGraphicsBeginImageContextWithOptionsの2番目の引数と考えることができます。もしアルファチャネルがあれば、レイヤーは透明になります。もし時間があるならば、edgeAntialiasingMaskフラグ –

+1

驚くばかり。私はUIImageにアルファチャンネルを追加していました.2pxの透明なボーダーを追加して、画像をレイヤーのコンテンツとして使用していました。 Perfはアルファと透明な境界線を追加しないことで大幅に改善されました - 30層以上の問題はありません。残念ながら、edgeAntialiasingMaskは効果がないようです。私はバグを報告します。 – TomH

3

すべてのレイヤーがGPUのメモリまたはメモリの一部に収まらない場合は、処理が大幅に遅くなります。 GPUメモリのロードとアンロードは、GPUメモリのレイヤーを合成するのに比べてかなり遅いと報告されています。古いデバイスは、最新のデバイスよりも少ないGPUメモリを使用できるため、このメモリ制限を試してみる必要があります。