【问题标题】:Achieve smooth scrolling for Photo Grid with thousands of images from disc使用光盘中的数千张图像实现 Photo Grid 的平滑滚动
【发布时间】:2012-12-20 21:42:42
【问题描述】:

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

我有一个内存缓存(使用 NSCache),它可以容纳 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;
    }
    

getImageFromCacheForImagePath:imagePath如果存在则立即从NSCache中获取图像,如果不存在,则从文件中加载图像并设置到NSCache中以供以后使用,但我将NSCache的限制设置为100。

我尝试/调整的东西:

  1. 避免clipsToBounds 用于网格图像视图。
  2. 在后台线程上加载图像。
  3. 使用NSOperation 队列。
  4. 分批加载 100 张图片(有效,但滚动速度很快,图片加载时间有所延迟)。

我正在努力实现与原生照片应用相同的感觉。

感谢您的建议。

【问题讨论】:

  • 请查看您问题中的代码。格式化需要帮助,完成后会发现一些问题(参见代码^{,它看起来应该开始一个新的代码块,但对我来说似乎不正确)。我们试图帮助您正确格式化,但还不是很清楚。
  • 我想知道他们是否没有像在导入时那样离线生成缩略图,然后缩略图的小尺寸为他们提供了主线程加载的显着优势。

标签: ios ios5 ios6 smooth-scrolling nscache


【解决方案1】:

几天前我也遇到了同样的问题,所以 GitHub 是搜索开源解决方案的最佳位置,所以试试这些链接。

检查PF-GridViewDTGridView

也看看AQGridViewHow to Write a Custom Image Picker like UIImagePicker

只需要根据我们的需要进行位操作,它就像一个冠军。

【讨论】:

  • 感谢您的建议,我面临的问题更多是巧妙和及时地将图像从磁盘加载到内存,这样我就不会使用太多内存,但仍然可以在网格视图上平滑滚动显示图像。就像原生照片应用程序一样,即使有数千张照片,它们也可以平滑滚动,就像所有图像都在内存中一样。我想弄清楚他们是如何处理它的。
【解决方案2】:

我已经实现了一个包含 700 多个图像的平滑滚动表。关键是不仅要在后台加载图像,还要在后台调整其大小以完全适合容器。显然,调整大小的操作过于繁重,无法在 UI 线程中进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多