2


数か月前、Apple のサイトで本当に素晴らしいサンプル コードを見つけました。このサンプルは「LargeImageDownsizing」と呼ばれ、画像がリソースから読み取られて画面にレンダリングされる方法について多くのことを説明しています。
そのコードを掘り下げていると、少し気になることがわかりました。縮小された画像は、CATiledLayer を持つビューに渡されますが、メモリ パフォーマンスを向上させるために各タイルに画像を提供するのではなく、タイル サイズを設定してから画像を読み込むだけです (コンセプトに簡単に移動できるようにしています)。 )。
だから私の質問は基本的になぜですか?正しい方法でフィードされていない場合、CATiledLayer を使用するのはなぜですか?通常の UIImageView を使用できたはずです...
そのため、自分が正しいかどうかを確認するためにいくつかのテストを行いました。サブビューとして画像ビューを含むスクロールビューを追加し、ズームのためにデリゲートスクロールビューに応答するコードを簡単に変更します。私は、デバイスとシムでテストしてこれらの結論に行きました:

  1. -メモリへの影響とフットプリントはまったく同じで、ズームスクロール操作中でもまったく驚くことはありません。画像はメモリに解凍されます
  2. - 時間プロファイルによると、タイルビューはスクロールズーム操作中に uiimageview の代わりに描画されるのにより多くの時間がかかりますが、uiimageview が既に描画されていることはまったく驚きではありません
  3. -メモリ警告を送信した場合、2つのソリューション間で何も変化しません(simのみ)
  4. -コア アニメーションのパフォーマンスをテストする 60FPS 前後で同じ結果が得られます

では、これらの 2 つのビュー/レイヤーの間の取り決めは何ですか?これらの特定のケースで、なぜ一方を選択する必要があるのでしょうか? UIImageView が戦いに勝ったようです。

誰かがそれを理解するのを手伝ってくれることを願っています。

4

1 に答える 1

0

OS パフォーマンスの点での唯一の違いは、CATiledLayer がバックグラウンド スレッドで描画することであるため、小さな画像でも同じように機能する可能性があります。タイル サイズによっては、CATiledLayer は 1 つの画像に対して複数のタイルを描画する必要があるため、さらに遅くなります。

しかし ...

CATiledLayer のポイントは、すべてのタイルを描画する必要がないことです。特に、非常に大きな画像にズームインする場合はそうです。どの部品が実際に必要かを知ることは賢明です。また、不要になったタイルを削除することも賢明です。

または、このメカニズムを機能させるには、画像の個々の部分を個別に提供する必要があります。おそらく圧縮されていないメモリに保持できない画像の合計サイズについて話しています。

于 2012-01-15T15:20:07.283 に答える