6

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

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

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

  • 我的项目中添加了大约 90 张图像。其中一半采用@2x 尺寸设计,以支持新 iPad 视网膜显示屏。因此,每个设备的最大图像数量约为 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

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

4

2 回答 2

0

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

于 2012-09-21T12:21:33.290 回答
0

首先是使用-[UIImage imageNamed:]符合任何条件的图像:

  • 大号
  • 中型
  • “……只有一个实例……在应用程序生命周期中创建。”

但是您需要注意这些更改如何影响您的程序。您目前尽可能依赖内存。我的建议是将其中一些责任转移到其他领域。分配负载,因此它仍然感觉很快,但具有更好的资源平衡。一旦您使用较少的缓存,您会注意到您最终可能会多次读取和扩展某些文件。然后尝试找出应该在哪里共享加载的图像。当然,只加载你需要的。然后把你学到的东西拿来看看它是否可以应用于你的其他图像。

另外,分解你的图像——你的图像比显示器的尺寸大几倍。如果它们需要达到那个大小,则将它们分解——如果它们只在呈现时按比例缩小,然后在分发之前调整它们的大小(例如,它们不需要缩放——显示速度会更快,看起来更好,并消耗更少的内存)。

于 2012-09-21T12:58:30.710 回答