0

在内存中处理大量图像可能是一个可接受的解决方案?

目前我正在构建一个照片共享应用程序(在某种意义上类似于 Instagram)。我已经能够模仿他们在提要中快速加载许多图像(结合图像的预加载和延迟加载),但我有点坚持如何处理这些图像可能占用的大量内存有。

CoreData 是临时图像存储的选项吗?使用 NSCoder 将对象写入临时目录是另一种选择吗?我正在尝试主动避免内存崩溃,并且我不确定 CoreData、临时文件夹或其他方式是否足够体面,以减少(可能)数百张图像的内存占用,如果用户在他们的提要中滚动漂亮远的。这些也不会是永久性的。

(对于它的价值,现在我为每个包含元数据和图像的图像都有一个对象表示,它们存储在一个基本的数组结构中。它现在运行良好,但我想确保我是否正在加载数百张图像我可以减少内存占用但仍然能够快速访问这些对象)

4

3 回答 3

2

在我自己的几个应用程序中,我遇到了这个确切的困境,我不得不在表格视图中显示数百个 UIImage 对象。

我为我的应用程序所做的解决方案之一是不在内存中存储全分辨率图像,而是将缩略图(我使用可用的 UIImage+Resize.h 类别扩展缩小并在此处描述)。一旦用户决定编辑或使用照片,我就会加载整个全分辨率图像。

您还可以将这些缩略图(或至少它们的图像数据)保存到“ ~/Library/Caches/”文件夹中的小文件中。

于 2012-12-09T05:51:44.203 回答
0

如果性能是问题,那么核心数据会给你更多的粒度。在这里您可以按部分保存它,也可以使用延迟加载。

于 2012-12-09T05:50:31.997 回答
0

如果您非常简单地存储一堆图像,CoreData 就太过分了。为了提高效率,无论如何您都必须将其设置为将图像存储在数据库之外,因此最终可能需要更多工作。

显而易见的方法 - 将所有图像保存到某个地方的缓存文件夹中的文件 - 是合理的(尽管我将很快解释,可能没有必要)。然后,您可以根据需要重新创建它们。通过将图像保存在 NSCache 中,其中它们的“成本”是它们的文件大小,并且您施加了一些总成本限制,您可以限制总内存消耗。

但理想情况下,您可以找到一种方法将图像存储在磁盘上,以便可以直接映射它们。这将让您同时将它们全部映射,VM 系统本质上将为您提供一个有效的 LRU 缓存。不过,它包含的内容较少 - 它们还可能会从您的应用程序的其他部分窃取内存。使用高级图像类(例如 UIImage)找到一种方法也可能很棘手。但是你可以很容易地接近 - UIImage 文档说:

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

因此,您可以使用创建 UIImage imageWithContentsOfFile:,它们会根据需要清除内存中的图像副本,并在必要时重新加载(即再次绘制时)。不过,他们实际上可能不会映射文件 --[NSData initWithContentsOfMappedFile:]不幸的是,从 iOS 5 开始不推荐使用。

哪种方法有意义取决于您的使用要求 - 如果您能够可靠地预测您将需要哪些图像,手动管理它们可能会给您带来更好的用户体验,因为您将提前加载它们并避免实际过程中的延迟绘画。

于 2012-12-09T17:51:17.067 回答