通过光盘上的数千张图像实现Photo Grid的平滑滚动

时间:2013-01-07 06:54:15

标签: ios ios5 ios6 smooth-scrolling nscache

我有PhotoGrid,每行有三张照片,使用UITableView实现。

我有一个内存缓存(使用NSCache),它有100个图像的容量,所以有一次我将在内存中最多有100个图像,即使我在光盘上有数千个图像显示在网格。

我的所有图片都是4KB-20KB的JPEG。

因此,使用此基础结构,当用户滚动照片网格时,图像将不断从NSCache加载和卸载。正常滚动一切看起来都不错,我得到55-58 fps左右。

当用户来回快速滚动时,我有两种情况:

  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;
    }
    
  3. getImageFromCacheForImagePath:imagePath立即从NSCache获取图像(如果不存在),如果没有,则从文件加载图像并将其设置为NSCache供以后使用,但我将NSCache的限制设置为100。

    我尝试/调整的事情:

    1. 避免使用clipsToBounds网格图片视图。
    2. 在背景线程上加载图片。
    3. 使用NSOperation队列。
    4. 分批加载100张图片(有效,但快速滚动,图片加载时间延迟)。
    5. 我正在努力实现与原生照片应用相同的感觉。

      您的建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

我已经实现了一个包含700多张图像的平滑滚动表。关键不仅是在背景中加载图像,还要在背景中调整大小以完全适合容器。显然调整大小是在UI线程中执行它太重的操作。