iPhone中高效内存的图像缓存方式

时间:2012-07-22 08:32:20

标签: iphone memory-management uiimageview uiimage image-caching

我想为91张图片缓存图片。所有图像都约为50mb。我看到很多内存用完了。

我的代码在这里。有效记忆的最佳方法是什么?

lG2Image[0] = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"background" ofType:@"png"]];
lG2Image[1] = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myimage1" ofType:@"png"]];
lG2Image[2] = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myimage2" ofType:@"png"]];
...


UIImageView* tmp;

for (int i=0; i<91; i++) {
    tmp = [[UIImageView alloc] initWithImage:lG2Image[i]];
    [_window addSubview:tmp];
    [tmp removeFromSuperview];
    tmp = nil;
}

2 个答案:

答案 0 :(得分:0)

您可以重复使用UIImageView

iPhone的屏幕尺寸是固定的,这意味着可视区域是固定的。 例如,如果要在可见屏幕上显示3个图像,则可以创建3个UIImageView,移动视图时,可以根据当前可见视图的位置加载新图像,不在可见视图上的图像屏幕可以发布。

如果您使用UITableView,则可以查看LazyTableImages

答案 1 :(得分:0)

您有2个选项。选项1,只需“根据需要”加载游戏图像元素,如果这是一个2D游戏,那么当它们即将出现在屏幕上时加载元素。选项2,将图像数据解压缩为BGRA格式的原始像素文件,然后使用[NSData dataWithContentsOfMappedFile]和CGDataProviderCreateWithData()以及CGImageCreate()创建CGImageRef,然后将其包装为UIImage。第二种方法是非常低级的,但它避免了每次访问资源时必须再次解析图像内容(解压缩的图像数据已经存储在文件中)。此外,Apple已经优化了CoreGraphics读取2D图像的方式,使得整个存储器内容可以保留在主存储器中而不是复制到图形存储器,这意味着您可以使用此方法加载一堆图像。如果可以,我会首先尝试选项#1,你可能不会同时需要内存中的所有内容。但是选项#2可以为您提供大约700兆的工作内存,您的iOS应用程序可以从文件中映射,远远超过可以分配为常规内存。