2013-01-07 5 views
6

の各行に3枚の写真が実装され、UITableViewを使用して実装されています。ディスクからの何千もの画像を含むフォトグリッドのスムーズなスクロールを実現

私は、ディスク上に何千もの画像が表示されているにもかかわらず、一度に100枚の画像をメモリに保存しています(NSCacheを使用している)グリッド。

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

このインフラストラクチャでは、ユーザーがフォトグリッドをスクロールすると、NSCacheからイメージが連続的にロードされ、アンロードされます。通常のスクロールではすべてが良く見えますが、55〜58fps前後になります。

ユーザーが前後に速くスクロールを開始すると、私は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を得る。

getImageFromCacheForImagePath:imagePath

(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIImage *image = getImageFromCacheForImagePath:imagePath; 
    cell.leftGridItem.imageView.image = image; 
} 
は、それは、存在しない場合は、画像がファイルからロードされ、後の使用のためNSCacheに設定されているが、私は100

NSCacheの上限を設定した場合NSCacheからすぐに画像を取得します

私が試した事/微調整:

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

私はネイティブPhotosアプリと同じ感触を達成しようとしています。

あなたの提案は高く評価されます。

+1

ご質問のコードを確認してください。書式設定には助けが必要でしたが、完了したらいくつかの問題が明らかになりました(コード '^ {'は新しいコードブロックを開始するはずですが正しいとは思われません)。私たちはあなたが正しいフォーマットになるのを手伝ってくれましたが、それは本当に明確ではありません。 – ErikE

+0

インポート時のようにサムネイルがオフラインで生成されていないのだろうかと思っています。サムネイルのサイズが小さいと、メインスレッドの読み込みに大きな利点があります。 –

答えて

0

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

チェックPF-GridViewまたはDTGridViewです。

もちょうど私達の必要性に応じてビットmanupulationを行う必要があり、それはチャンピオンのように動作しAQGridViewHow to Write a Custom Image Picker like UIImagePicker

に見てみましょう。

+0

提案のおかげで、問題は、ディスクからメモリへのイメージの読み込みを巧みかつタイムリーに進めていくために、メモリをあまり使わずにスムーズなスクロールでグリッドビューにイメージを表示するようになっています。ネイティブPhotosアプリのように、何千枚もの写真があっても、すべての画像があたかもメモリ内にあるかのように滑らかにスクロールします。私は彼らがそれをどのように扱っているか把握しようとしています。 –

0

私は、700以上の画像を持つ滑らかなスクロールテーブルを実装しました。キーはバックグラウンドで画像をロードするだけでなく、コンテナに完全に合うようにバックグラウンドでサイズを変更することでした。UIのスレッドで、Appletntリサイズを行うのは重すぎる操作です。

関連する問題