6

最近、アプリでメモリ管理の問題に直面しました。

このアプリケーションは高品質の画像を利用するため、メモリ使用量が大幅に増加します。

問題をより明確にするために、プロジェクトと画像の詳細に関するいくつかの情報を次に示します。

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

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

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

  • 標準バージョンの画像の個々の画像の最大解像度は約 1500x4000 px で、最小解像度は約 60x60 px です。

  • Retina バージョンの画像の個々の画像の最大解像度は約 3000x8000 px で、最小解像度は約 120x120 px です。

  • Retina バージョンのイメージには、名前に「@2x~ipad」という接尾辞が付いていますが、他のイメージの名前の接尾辞は「~ipad」です。

  • アプリのライフサイクル中に作成されるほとんどのイメージのインスタンスは 1 つだけです。

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

  • [UIImage imageNamed:@"image_name.png"] 画像をロードしたい場所ならどこでも使用しました ([UIImage imageWithContentsOfFile] と [UIImage imageWithData] の使用は非常に非効率的でした)。

しかし、ここに問題があります:

Instruments を使用してメモリ使用量を追跡すると、アプリのメモリ使用量が非常に高いことがわかります。さまざまな状況でのメモリ割り当ての統計を次に示します。

  • 起動時に標準イメージを使用して iPad 2 に割り当てられたメモリ: 58 MB

  • ゲームプレイ中の標準イメージを使用した iPad 2 の割り当てメモリ (すべてのイメージがロードされた場合): 131 MB

  • 起動時に Retina イメージを使用する新しい iPad に割り当てられたメモリ: 211 MB
  • ゲームプレイ中に Retina 画像を使用した新しい iPad に割り当てられたメモリ (すべての画像が読み込まれた場合) : 470 MB

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

4

2 に答える 2

0

まず、どの資格にも当てはまる画像には使用しないことから始めます。-[UIImage imageNamed:]

  • 大きいサイズ
  • 中型
  • 「…アプリのライフサイクル中に作成されたインスタンスは1つだけです。」

ただし、これらの変更がプログラムにどのように影響するかに注意を払う必要があります。現在、可能な限りメモリに依存しています。私が提案しているのは、それらの責任の一部を他の分野に移すことです。負荷を分散して、高速に感じられるようにしますが、リソースのバランスを改善します。キャッシュの使用量を減らすと、一部のファイルを複数回読み取って展開することになります。次に、読み込んだ画像をどこで共有するかを考えてみてください。もちろん、必要なものだけをロードしてください。次に、学んだことを取り入れて、それを残りの画像に適用できるかどうかを確認します。

また、画像を分割します。ディスプレイのサイズの数倍の画像があります。それらをそのサイズにする必要がある場合は、分割します。表示されたときにのみ縮小される場合は、配布前にサイズを変更します(たとえば、拡大縮小が不要な場合)。表示がはるかに高速になり、見栄えがよくなります。消費するメモリが少なくなります)。

于 2012-09-21T12:58:30.710 に答える
0

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

于 2012-09-21T12:21:33.290 に答える