私はいくつかのCALayersをUIViewのレイヤのサブレイヤとして追加しています。各レイヤーの内容は、サーバーからダウンロードされた別のイメージです。各レイヤーは、オフスクリーンからランダムに生成された位置にアニメーション化されます。画像データは非同期にダウンロードされます。各画像は約300x300以下です。CALayer最適化?
ランダム配置の結果、レイヤーが重なり、レイヤーの上にあるレイヤーによって不明瞭になります。これはすべていいです。
私はレイヤーが完全に見えなくなっているので、レイヤーを削除しています。the answer to this questionでの提案を使用して、レイヤーを削除しています。カバレッジを計算する計算は別のスレッドで行われます。
私はUIPanGestureRecognizerを使用して、ユーザーが画面上でレイヤーをドラッグできるようにしました。
追加されたレイヤーの数が25〜30に近づき、ますます悪化するとパフォーマンスに問題が発生します。アニメーションは不安定になり、しばしば完全に欠けています(新しく追加されたレイヤーは最終的な位置に表示されます)。また、パンのジェスチャは無視されるか、選択したレイヤーが不安定に再配置されます。
私は、すべてのレイヤーがオーバーラップし、もう1つのレイヤーがアニメーション化されているGPUを殺していると思いますか?
パフォーマンスを改善する方法についてのご意見はありますか?
多数のレイヤを処理するベストプラクティス?
レイヤーを以前に追加したレイヤーとは別のview.layerでアニメーションを開始する方がよいですか?
ありがとうございます!
ありがとうございました。私はそれを撃つだろう。私はlayer.contents(レイヤーが描画されているときのみ使用されます)を提供するとき、不透明が無視されたという印象を受けました。アルファビットはもっと複雑になります。回転したエッジを滑らかにするために、画像のエッジの周りに2ピクセル幅の透明な境界線を使用しています。インストゥルメンツへ – TomH
こんにちはTom - yepの不透明さは無視されます。描かなければ、UIGraphicsBeginImageContextWithOptionsの2番目の引数と考えることができます。もしアルファチャネルがあれば、レイヤーは透明になります。もし時間があるならば、edgeAntialiasingMaskフラグ –
驚くばかり。私はUIImageにアルファチャンネルを追加していました.2pxの透明なボーダーを追加して、画像をレイヤーのコンテンツとして使用していました。 Perfはアルファと透明な境界線を追加しないことで大幅に改善されました - 30層以上の問題はありません。残念ながら、edgeAntialiasingMaskは効果がないようです。私はバグを報告します。 – TomH