2012-09-21 10 views
5

私は最近、私のアプリでいくつかのメモリ管理の問題に直面しました。非常に高いメモリ使用量 - iPadで大きな画像を扱うには?

このアプリケーションでは、いくつかの高品質画像が利用されており、メモリ使用量が大幅に増加しています。ここで

は、問題がより明確にするプロジェクトやイメージの詳細に関するいくつかの情報は以下のとおりです。

  • 私のプロジェクトに追加した約90の画像があります。それらの半数は、New iPad Retina Displayをサポートするために、2倍のサイズで設計されています。したがって、各デバイスの画像の最大数は約45です。

  • すべての画像の網膜バージョンの合計サイズは約25メガバイトです(個々の画像のサイズは10 KBから6.8 MBまで可変です)。一方、すべての標準画像のサイズは11メガバイトに等しい。

  • プロジェクトのXCodeアーカイブのサイズは、44メガバイトです。

  • 画像の標準バージョンでの個別画像の最大解像度は約1500x4000pxですが、最小値は60x60pxです。

  • Retina版の画像の最大解像度は約3000x8000pxで、最小は120x120pxです。

  • 画像の網膜版の名前には「@ 2x〜ipad」というサフィックスがあり、他の名前の接尾辞は「〜ipad」です。

  • ほとんどの画像のインスタンスは、アプリのライフサイクル中に作成されます。

  • アプリ起動中に約25枚の画像が読み込まれ、残りはゲームプレイ中に読み込まれます。

  • [UIImage imageNamed:@ "image_name.png"](UIImage imageWithContentsOfFileを使用し、[UIImage imageWithData]を使用すると非常に効率的ではありませんでした)どこでも画像をロードします。

しかし、ここで問題がある:私はアプリのメモリ使用量が非常に高いことがわかり楽器を使用してメモリ使用量を追跡

が。ここでは、メモリ割り当てのの統計は、さまざまな状況にあります。起動時に標準画像を使用してiPad 2の上

  • 割り当てられたメモリ:(すべての画像ゲームプレイ中に標準画像を使用してiPad 2の上の58メガバイト

  • 割り当てられたメモリ)ロードされます。起動時に網膜の画像を使用して新しいiPad上で131メガバイト

  • 割り当てられたメモリ:すべてのイメージがロードされているゲームプレイ()の間、網膜の画像を使用して新しいiPad上で211メガバイト
  • 割り当てられたメモリ:470メガバイト

メモリが割り当てられた理由は、画像の合計サイズよりもはるかに高いですか?

+0

なぜ画像をメモリに読み込んでいますか? UIImage imageNamedを使用しないでください。代わりにUIImage imageWithContentsOfFileを使用してください。後でメモリにイメージを永続的にロードしないようにしてください。また、イメージが巨大である場合、それらをCATiledLayerクラスに描画して描画する必要がありますそれらは画面にもっと効率的に表示されます。 – Lefteris

+0

ゲームの前と最中にすべての画像が必要なので、すべての画像をメモリにロードしています。 他のアプリのような通常のデザインには従っていないので、それらの画像を読み込む必要があります。言い換えれば、必要なときにのみ各イメージをロードしていますが、起動時にすべてのイメージをロードする必要があるという問題があります。D –

答えて

0

これはおそらく、使用している画像がpngまたはjpgで圧縮されていて、メモリにデコードされた画像が元のファイルサイズよりもはるかに大きいためです。画像の内容に関係なく、幅*高さ* 4バイトのメモリを使用します。

+0

他の圧縮方法やその他の拡張機能がありますか?そのような巨大なメモリの使用? –

0

スタートはに資格のいずれかに合わせてイメージのため使用-[UIImage imageNamed:]ないだろう:「

    • 大型中規模...一つだけ...アプリ時に作成しましたライフサイクル。"

    ただし、これらの変更がプログラムに与える影響には注意が必要です。あなたは現在、可能な限りメモリに頼っています。私が示唆しているのは、それらの責任の一部を他の分野に移すことです。負荷を分散して、まだ速く感じるが、リソースのバランスが改善される。一度キャッシングを少なくすると、一度に複数のファイルを読み込んで展開することになります。あなたが読み込んだイメージをどこに共有すべきか把握してみてください。もちろん、必要なものだけをロードしてください。あなたが学んだことを取り、あなたのイメージの残りの部分に適用することができます参照してください。

    また、画像を壊す - ディスプレイのサイズよりも数倍大きい画像があります。そのサイズにする必要がある場合は、それらを分割する - 提示されたときに縮小された後、配信前にサイズを変更する(例えば、スケーリングを必要としないように - 表示するのがはるかに速く、メモリを消費しません)。

  • 関連する問題