2012-01-11 10 views
8

これは実際には特定の問題に対処するための質問ではなく、正しい方向に向けられた要求です。UIImageViewとUIView/Image - 効率

私はいくつかの画像(JPGとして保存されている)を画面に同時にロードしているアプリケーションを作っていますが、これはそのままの状態でなければなりません。すぐに表示されます。

約800px * 600px解像度で30枚の画像を読み込もうとしましたが、画像の '圧縮された'サイズ(これは約200KB)しかロードされないと思っていました。もちろん、後でいくつかのメモリの警告、私はどのように愚かな私が実現しました。だから私は今それらのサイズをそれぞれ約400px * 300pxに変更し、私のiPhone 4Sはメモリ要件に対応しています。

私はもともとdrawRectでカスタム描画画像を描画したUiViewを使用しましたが、UIImageViewを使用して切り替えると状況が大幅に改善されました。アプリは非常に高速で反応が良いです。 私のレイヤーのラスタライズをオフにすると、パフォーマンスに大きな違いがあることもわかりました。

「発見」のこれらの種類は、私ができるだけ効率的に画面に画像を読み込むために使用できる特定のデザインパターンやリソースがあるかどうか、私は思っていました。主に可能な限り小さなメモリを使用することについて - 親指の良いルールがありますか?なぜUIImageViewとUiViewを使用してイメージを作成したのですか?

誰かが助けてくれれば非常に感謝します。

ありがとうございました。

答えて

9

-drawRect:を実装すると、システムはビューと同じサイズのビットマップイメージを割り当てます(結局、描画するバッファが必要になります)。あなたがしているのは、既にロードしたイメージを描画している場合、そのイメージのメモリ使用量を2倍にしてしまったからです(ロードしたコピーと直前に作成した2番目のコピーがあるためです)。

同様に、ラスタライズレイヤでは、レイヤと同じサイズのビットマップイメージを割り当てる必要があるため、ラスタライズするバッファが用意されています。だから、それを回すこともメモリを吸い上げる(層の大きさに比例する)。

基本的な目安は余分な仕事をしないことです。 -drawRect:を使用して画像を描画すると余分な作業が必要になります。レイヤーのラスタライズは余分な作業です(ただし、レイヤーによっては、後でパフォーマンスを節約するために、これは1回限りのパフォーマンスコスト(および一定のメモリコスト)になる可能性があります。たとえば、CAShapeLayerの場合、または描画シャドウの場合)。画面にレンダリングする前に常にスケールダウンする大きな画像をメモリに保持することは余分な作業です(イメージをロードするときに一度スケールし、スケールされたコピーを保持する)。

さらに、画像を描画することを目標にする場合は、可能であればUIImageViewを使用するようにしてください。これは、一般的に画面に画像を表示する最も速くて安い方法であり、それはかなり柔軟です。

8

デザインパターンは基本的にはUIImageViewです。 Appleは多くの時間を費やして時間を費やしており、Appleはあなたが使っていないプライベートAPIを使用することが許されています。

つまり、自分でやりたければ、画像ごとにCALayerを試してみるべきです。イメージをロードしてcontentプロパティーをCALayerに設定するだけです。 CALayerはその内容をGPUメモリにキャッシュすることができ、パブリックAPIではできないその他の最適化を行うことができます。

アップルの開発用ビデオを見れば、あなたのUIを素早く作ることができます。彼らは書かれたドキュメントにないか、見つけることが難しい/ドキュメント内で見落としやすい、多くのヒントと "内部情報"を含んでいます。開発ビデオは、http://developer.apple.com/videos/です。あなたの質問に関連するいくつかの良いもの:

  • iOS版 - "の理解iOSのビューコンポジ"
  • WWDC 2011から
  • WWDC 2011 "のUIKitレンダリングについて" - "iOSの開発者のための実用的なドローイング"
  • WWDCを2011年 - "Core Animationのエッセンシャル"
  • WWDC 2010 - リンクについては "実践のCore Animation"
+1

おかげで - 彼らは非常に有用でした。 – Vazzyb

+2

+1 Appleのビデオを示唆している(特に、Appleのビデオを検索して視聴するためのインターフェースがひどいから!) –

+0

@KevinZychはあなたが[asciiwwdc.com](http://asciiwwdc.com)をチェックしたことがありますか? – Honey