0

メモリ内の大量の画像を処理するための許容可能なソリューションは何ですか?

現在、私は写真共有アプリケーションを構築しています (ある意味で Instagram に似ています)。フィード内の多くの画像の高速読み込み (画像の事前読み込みと遅延読み込みを組み合わせて) を模倣することができましたが、これらの画像が潜在的に大きなメモリ フットプリントを処理するために何をすべきかについて少し行き詰まっています。持ってる。

CoreData は一時的なイメージ ストレージのオプションですか? NSCoder の別のオプションを使用してオブジェクトを一時ディレクトリに書き込んでいますか? 私は積極的にメモリ クラッシュを回避しようとしていますが、CoreData、一時フォルダー、またはその他の手段が、ユーザーがフィードをかなりスクロールした場合に (潜在的に) 何百もの画像のメモリ フットプリントを削減するのに十分であるかどうかはわかりません。遠い。これらも永続的ではありません。

(価値があるのは、今のところ、メタデータと画像を保持する各画像のオブジェクト表現があり、それらは基本的な配列構造に格納されていることです。今のところうまく機能しますが、ロードしているかどうかを確認したいです数百の画像のメモリ使用量を減らすことができますが、これらのオブジェクトにすばやくアクセスできます)

4

3 に答える 3

2

私自身のいくつかのアプリで、テーブル ビューに何百もの UIImage オブジェクトを潜在的に表示しなければならなかったあなたと同じように、まさにこのジレンマに遭遇しました。

私が自分のアプリで行った解決策の 1 つは、フル解像度の画像をメモリに保存するのではなく、サムネイルを保存することでした (利用可能な UIImage+Resize.h カテゴリ拡張を使用して縮小し、ここで説明します)。ユーザーが写真を編集または利用することを決定したら、フル解像度の画像全体を読み込みました。

これらのサムネイル (または少なくともその画像データ) を " ~/Library/Caches/" フォルダー内の小さなファイルに保存することもできます。

于 2012-12-09T05:51:44.203 に答える
0

大量の画像を保存するだけの場合、CoreDataはやり過ぎです。効率を上げるには、とにかくデータベースの外部に画像を保存するように設定する必要があるため、おそらくより多くの作業が必要になります。

すべての画像をどこかのキャッシュフォルダ内のファイルに保存するという明白なアプローチは合理的です(ただし、後で説明しますが、おそらく不要です)。その後、必要に応じてそれらを再作成できます。「コスト」がファイルサイズであるNSCacheに画像を保持し、合計コスト制限を課すことにより、合計メモリ消費量を抑えることができます。

しかし、理想的には、画像をディスクに保存して、直接mmapできるようにする方法を見つけることができます。これにより、それらすべてを同時にマップすることができ、VMシステムは基本的にそれらすべてに対して効率的なLRUキャッシュを提供します。ただし、これはあまり含まれていません。アプリの他の部分からメモリを盗む可能性もあります。また、高レベルの画像クラス(UIImageなど)を使用してこれを行う方法を見つけるのは難しい場合があります。しかし、非常に簡単に近づくことができます-UIImageのドキュメントには次のように書かれています。

メモリが少ない状況では、UIImageオブジェクトから画像データを削除して、システムのメモリを解放することができます。このパージ動作は、UIImageオブジェクトによって内部的に保存された画像データにのみ影響し、オブジェクト自体には影響しません。データがパージされた画像を描画しようとすると、画像オブジェクトは元のファイルからデータを自動的に再読み込みします。ただし、この余分な負荷ステップにより、パフォーマンスがわずかに低下する可能性があります。

したがって、を使用してUIImageを作成するimageWithContentsOfFile:と、必要に応じてメモリ内の画像のコピーが削除され、必要に応じて(つまり、再度描画するときに)再読み込みされます。ただし、実際にはファイルをマップしない場合がありますが、-[NSData initWithContentsOfMappedFile:]残念ながらiOS5以降では非推奨になっています。

どちらのアプローチが理にかなっているのかは、使用要件によって異なります。必要な画像を確実に予測できる場合は、事前に画像を読み込んで実際の遅延を回避できるため、手動で管理することでユーザーエクスペリエンスを向上させることができます。図。

于 2012-12-09T17:51:17.067 に答える
0

パフォーマンスが問題になる場合は、コア データを使用すると、より詳細な情報が得られます。ここでは、部分ごとに保存でき、遅延読み込みも利用できます。

于 2012-12-09T05:50:31.997 に答える