【问题标题】:Extremely High Memory Usage - How To Handle Large Images on iPad?极高的内存使用率 - 如何在 iPad 上处理大图像?
【发布时间】:2012-09-13 20:33:43
【问题描述】:

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

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

这里有一些关于项目的信息和图片细节,让问题更清楚:

  • 我的项目中添加了大约 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

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

【问题讨论】:

  • 为什么要将所有图像加载到内存中?您应该避免使用 UIImage imageNamed,而是使用 UIImage imageWithContentsOfFile,因为后者不会将图像永久加载到内存中......此外,如果您的图像很大,您应该在 CATiledLayer 类中绘制它们,以便绘制它们更有效地显示在屏幕上
  • 我正在将所有图像加载到内存中,因为在游戏之前和期间都需要它们。它不像其他应用程序那样遵循通常的设计,并且需要加载这些图像。换句话说,我只在需要时才加载每个图像,但问题是所有图像都需要在启动时加载:D

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


【解决方案1】:

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

【讨论】:

  • 是否有任何其他压缩方法或任何其他扩展可以用来防止如此巨大的内存使用?
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2012-01-29
    • 2015-11-29
    相关资源
    最近更新 更多