6

PhotoGrid使用して実装された、各行に 3 枚の写真がありUITableViewます。

100 個の画像を格納できるメモリ内キャッシュ (NSCache を使用) があるため、グリッドに表示するディスク上に何千もの画像がある場合でも、一度に最大 100 個の画像をメモリに格納できます。

私の画像はすべて 4KB ~ 20KB の JPEG です。

したがって、このインフラストラクチャでは、ユーザーが写真グリッドをスクロールすると、NSCache から画像が継続的にロードおよびアンロードされます。通常のスクロールではすべてが良好に見え、55 ~ 58 fps 程度になります。

ユーザーが前後に速くスクロールし始めると、次の 2 つのケースがあります。

  1. 画像の読み込みタスクをメイン スレッドから切り離すと、画像がメモリに読み込まれる前にセルが表示されるため、フォト グリッドに画像が表示されなくなります。

    (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;
            });
        });
    }
    
  2. メイン スレッドで画像の読み込みタスクを実行すると、スタッターが発生します。36~45fpsくらい出ます。

    (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        UIImage *image = getImageFromCacheForImagePath:imagePath;
        cell.leftGridItem.imageView.image = image;
    }
    

getImageFromCacheForImagePath:imagePath存在する場合は NSCache からすぐに画像を取得し、存在しない場合は画像をファイルからロードし、後で使用するために NSCache に設定しますが、制限NSCacheを 100 に設定しました。

私が試した/微調整したこと:

  1. clipsToBoundsグリッド イメージ ビューには使用しないでください。
  2. バックグラウンド スレッドで画像を読み込んでいます。
  3. NSOperationキューの使用。
  4. 画像を 100 のバッチで読み込む (動作しますが、スクロールが速いため、画像の読み込み時間が遅くなります)。

ネイティブの写真アプリと同じ感覚を実現しようとしています。

あなたの提案は大歓迎です。

4

2 に答える 2

0

私も数日前に同じ問題に直面していたので、GitHub はオープン ソース ソリューションを検索するのに最適な場所です。これらのリンクを試してみてください。

PF-GridViewまたはDTGridViewを確認してください。

また、AQGridView、 UIImagePicker のようなカスタム イメージ ピッカーを作成する方法もご覧ください

必要に応じてビット操作を行うだけで、チャンピオンのように機能します。

于 2013-01-07T07:33:53.380 に答える