极高的内存使用率 - 如何在iPad上处理大图像?

时间:2012-09-21 12:00:29

标签: ios ipad memory-management instruments large-files

我最近在我的应用中遇到了一些内存管理问题。

该应用程序利用了一些高质量的图像,这极大地增加了内存使用量。

以下是有关项目和图像详细信息的一些信息,以使问题更加清晰:

  • 我的项目中添加了大约90张图片。其中一半设计为@ 2x尺寸,以支持新iPad Retina显示屏。因此,每台设备的最大图像数量约为45个。

  • 所有图像的Retina版本的总大小约为25兆字节(每个单独图像的大小可在10 KB到6.8 MB之间变化)。同时,所有标准图像的大小等于11兆字节。

  • 项目的XCode档案大小等于44兆字节。

  • 标准版图像中个人图像的最大分辨率约为1500x4000像素,而最小分辨率约为60x60像素。

  • Retina版图像中个人图像的最大分辨率约为3000x8000像素,而最小分辨率约为120x120像素。

  • Retina版图片的名称后缀为“@ 2x~ipad”,其他名称后缀为“~ipad”。

  • 在应用生命周期中只创建了大多数图片的一个实例。

  • 大约25张图片在应用启动期间加载,其余图片在游戏过程中加载。

  • 我使用[UIImage imageNamed:@“image_name.png”]无论我想加载图像(使用[UIImage imageWithContentsOfFile]和[UIImage imageWithData]效率极低)。

但这里有问题:

当我使用Instruments跟踪内存使用情况时,我发现应用程序的内存使用率非常高。以下是不同情况下内存分配的统计信息:

  • 在启动时使用标准图像在iPad 2上分配内存:58 MB

  • 在游戏过程中使用标准图像在iPad 2上分配内存(加载所有图像时):131 MB

  • 在启动时使用Retina图像在新iPad上分配内存:211 MB
  • 在游戏过程中使用Retina图像在新iPad上分配内存(加载所有图像时):470 MB

为什么分配内存的想法比图像的总大小要高很多?

2 个答案:

答案 0 :(得分:0)

这可能是因为您使用的图像是使用png或jpg压缩的,而当解码到内存时,图像的大小远远大于原始文件的大小。无论图像内容如何,​​它都会占用宽度*高度* 4字节的内存。

答案 1 :(得分:0)

一个开始就是使用-[UIImage imageNamed:]来获得符合任何资格的图像:

  • 大号
  • 中等大小
  • “...只有一个实例...在应用生命周期中创建。”

但您需要注意这些更改如何影响您的计划。你现在正在尽可能地依赖记忆。我的建议是将其中一些责任转移到其他领域。分配负载使其仍然感觉很快,但具有更好的资源平衡。一旦你使用较少的缓存,你会发现你最终可能会多次阅读和扩展一些文件。然后尝试找出你应该分享你加载的图像的位置。当然,只加载你需要的东西。然后拿走你学到的东西,看看它可以应用到你的其他图像。

另外,打破你的图像 - 你的图像比显示器的尺寸大几倍。如果它们需要那么大,那么就把它们拆开 - 如果它们只是在展示时缩小,那么在分发前调整它们的大小(例如它们不需要缩放 - 显示速度会快得多,看起来好多了,并消耗更少的内存。)