【发布时间】: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