の各行に3枚の写真が実装され、UITableView
を使用して実装されています。ディスクからの何千もの画像を含むフォトグリッドのスムーズなスクロールを実現
私は、ディスク上に何千もの画像が表示されているにもかかわらず、一度に100枚の画像をメモリに保存しています(NSCacheを使用している)グリッド。
私のすべての画像は4KB-20KBのJPEGです。
このインフラストラクチャでは、ユーザーがフォトグリッドをスクロールすると、NSCacheからイメージが連続的にロードされ、アンロードされます。通常のスクロールではすべてが良く見えますが、55〜58fps前後になります。
ユーザーが前後に速くスクロールを開始すると、私は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を得る。
getImageFromCacheForImagePath:imagePath
(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UIImage *image = getImageFromCacheForImagePath:imagePath;
cell.leftGridItem.imageView.image = image;
}
は、それは、存在しない場合は、画像がファイルからロードされ、後の使用のためNSCacheに設定されているが、私は100
に
NSCache
の上限を設定した場合NSCacheからすぐに画像を取得します
私が試した事/微調整:
- は、グリッド画像ビューのため
clipsToBounds
を避けてください。 - バックグラウンドスレッドに画像をロードしています。
NSOperation
キューの使用。- イメージを100のバッチで読み込んでいます(動作しますが、高速スクロールではイメージの読み込み時間が遅くなりました)。
私はネイティブPhotosアプリと同じ感触を達成しようとしています。
あなたの提案は高く評価されます。
ご質問のコードを確認してください。書式設定には助けが必要でしたが、完了したらいくつかの問題が明らかになりました(コード '^ {'は新しいコードブロックを開始するはずですが正しいとは思われません)。私たちはあなたが正しいフォーマットになるのを手伝ってくれましたが、それは本当に明確ではありません。 – ErikE
インポート時のようにサムネイルがオフラインで生成されていないのだろうかと思っています。サムネイルのサイズが小さいと、メインスレッドの読み込みに大きな利点があります。 –