0

ドキュメント ディレクトリから画像ファイルのリストを読み込んでカスタム UITableViewCell 内に設定していますが、以前の作業ではメモリが多すぎたか、UITableView のスクロール パフォーマンスが低下していました。

これらの各メソッドで、画像をコンテナー クラスに読み込み、次に配列に読み込みます。

私が試したこと:

  • UIImage+ImmediateLoad (ファイル パスから画像をロードし、メモリに直接ロードするカスタム UIImage カテゴリ。これにより、60FPS のスクロールが発生しますが、ユーザーが 100 個以上のアルバムを持っている場合、アプリケーションがクラッシュします。)

  • MPMediaItem valueForProperty:MPMediaItemPropertyArtwork メソッド。(ただし、これにより、スクロール フレーム レートが劇的に低下します。これにより、画像がメモリに直接読み込まれるとは思いません (間違っている場合は修正してください)。)

  • UITableViewCell 自体にファイル パスを渡し、画像をロードします。これにより、スクロールも遅くなりますが、メモリは抑制されません。

これらの画像はそれぞれ最大 1MB です。

要するに (そして、私が多くを求めていることはわかっています)、Documents ディレクトリに画像をロードする方法を求めています。これは、メモリをあまり消費せず、スムーズにスクロールできます。

4

1 に答える 1

2

もう 1 つの戦略は、イメージ パスの順序付けられたリストと、一致する可変配列を用意することです。ユーザーが位置 0 にいるとします。配列内の 0 ~ 10 の画像を読み込みます。ユーザーがスクロールすると、常に最後の n 個の画像が保持され、古い画像が解放され (変更可能な配列に NSNull が配置されます)、次の n 個がプリフェッチされます。これが苦労するのは、アクティブなスクロール中です。バックグラウンドでの作業が多すぎると、スクロールのスタッターが発生する可能性があります。ただし、特定の時点で比較的小さなデータ セットのみをメモリに保持することで、メモリの負担を軽減します。

他の考え。画像だけでなく、UIImageViews を保存できます。範囲外の画像を放り投げるのではなく、NSCache に放り込んでください。

他のすべてが失敗した場合は、PhotoScrollerNetwork が行うことを実行し、画像を 1 つの巨大なファイルで事前にレンダリングしてから、mmap を使用して特定の画像のピクセルを取得し、CGImage をすばやく作成します。ここでは、速度のためにファイル システム スペースをトレードオフします。

于 2013-05-14T12:19:35.480 に答える