をPhotoGrid
使用して実装された、各行に 3 枚の写真がありUITableView
ます。
100 個の画像を格納できるメモリ内キャッシュ (NSCache を使用) があるため、グリッドに表示するディスク上に何千もの画像がある場合でも、一度に最大 100 個の画像をメモリに格納できます。
私の画像はすべて 4KB ~ 20KB の JPEG です。
したがって、このインフラストラクチャでは、ユーザーが写真グリッドをスクロールすると、NSCache から画像が継続的にロードおよびアンロードされます。通常のスクロールではすべてが良好に見え、55 ~ 58 fps 程度になります。
ユーザーが前後に速くスクロールし始めると、次の 2 つのケースがあります。
画像の読み込みタスクをメイン スレッドから切り離すと、画像がメモリに読み込まれる前にセルが表示されるため、フォト グリッドに画像が表示されなくなります。
(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ UIImage *image = getImageFromCacheForImagePath:imagePath; dispatch_async(dispatch_get_main_queue(), ^{ cell.leftGridItem.imageView.image = image; }); }); }
メイン スレッドで画像の読み込みタスクを実行すると、スタッターが発生します。36~45fpsくらい出ます。
(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UIImage *image = getImageFromCacheForImagePath:imagePath; cell.leftGridItem.imageView.image = image; }
getImageFromCacheForImagePath:imagePath
存在する場合は NSCache からすぐに画像を取得し、存在しない場合は画像をファイルからロードし、後で使用するために NSCache に設定しますが、制限NSCache
を 100 に設定しました。
私が試した/微調整したこと:
clipsToBounds
グリッド イメージ ビューには使用しないでください。- バックグラウンド スレッドで画像を読み込んでいます。
NSOperation
キューの使用。- 画像を 100 のバッチで読み込む (動作しますが、スクロールが速いため、画像の読み込み時間が遅くなります)。
ネイティブの写真アプリと同じ感覚を実現しようとしています。
あなたの提案は大歓迎です。