【问题标题】:bad performance while I load lots of images in UICollectionView在 UICollectionView 中加载大量图像时性能不佳
【发布时间】:2013-07-03 12:22:46
【问题描述】:

我必须在 UIcollectionView 中显示很多图像,可能大于 200。图像尺寸很大。但是那里存在严重的性能问题。滚动变慢,有时会崩溃。我不知道在这种情况下优化的最佳方法是什么。 我有一个包含 UIImageView 的保管单元,我在方法中加载图像:

 - (UICollectionViewCell *)collectionView:(UICollectionView *)CollectionView    cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
PhotoCollectionCell *cell = [CollectionView dequeueReusableCellWithReuseIdentifier:kCellReuseIdentifier forIndexPath:indexPath];

 if(cell==nil){

        NSLog(@"cell is nil");
    }



    NSLog(@"%@",NSStringFromCGRect(cell.frame));
    ImagesDb *imageObj = [folderImagesArr objectAtIndex:indexPath.row];

    ImagesDataDb *imageData = imageObj.data;



    cell.cellImage.image = imageData.orignalImage;




    UILabel *titleLabel = (UILabel *)[cell viewWithTag:100];
    [titleLabel setText:[NSString stringWithFormat:@"%d",indexPath.row]];



        }

    return cell;


}

【问题讨论】:

  • [cell viewWithTag:100] - 这个方法有什么作用?
  • 这些图像的尺寸(尺寸)是多少? UIImageView 的边界是什么?
  • ImagesDb 是谁? ImagesDataDb 的大小是多少,这个对象的类型是什么?
  • [cell viewWithTag:100]---标签为100的标签
  • ImagesDb 是谁? ImagesDataDb 的大小是多少,这个对象的类型是什么?---它是一个 nsmanagedObject 。它包含图像数据

标签: iphone ios optimization ios6 uicollectionview


【解决方案1】:

您可以做的第一件事是限制在单元格中使用的图像的大小,因为现在您加载的是全尺寸图像。如果您显示的图像大小等于或小于单元格,这是最好的方法。

根据文档:

在内存不足的情况下,可能会从 UIImage 对象中清除图像数据以释放系统上的内存。这种清除行为只影响 UIImage 对象内部存储的图像数据,而不影响对象本身。当您尝试绘制其数据已被清除的图像时,图像对象会自动从其原始文件重新加载数据。然而,这个额外的加载步骤可能会导致小的性能损失。

您应该避免创建大于 1024 x 的 UIImage 对象 大小为 1024。除了大量的内存之外,这样的图像还会 消费,使用图像作为纹理时可能会遇到问题 在 OpenGL ES 中或将图像绘制到视图或图层时。这个尺寸 如果您正在执行基于代码的操作,则限制不适用 操作,例如调整大于 1024 x 1024 的图像大小 通过将其绘制到支持位图的图形上下文来绘制像素。事实上,你 可能需要以这种方式调整图像的大小(或将其分成几个 较小的图像),以便将其绘制到您的视图之一。

【讨论】:

  • 带有图像的简单集合视图:developer.apple.com/library/ios/#samplecode/…
  • 但我有一个疑问。在我的 collectionview 中,一次只显示 2/3 的图像。所以 os 应该只加载 2-3 个图像。这也会造成内存问题吗?
  • 当我滚动时,单元格会被重复使用,并且以前的图像会从内存中消失,所以为什么我会遇到这个问题?
  • 您可以在后台线程中下载您的图片,最好的方式是使用队列来限制上传/下载的图片数量。在后台下载图像后,您不应更新整个集合。使用 reloadItemsAtIndexPaths: 在主线程更新单元格
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2015-12-29
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多