1

我想缓存 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;
}
4

2 回答 2

0

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

于 2013-06-21T04:50:01.993 回答
0

您可以重复使用UIImageView.

iPhone的屏幕尺寸是固定的,也就是说可视区域是固定的。例如,如果要在可视屏幕上显示3张图像,则只需创建3个UIImageView,当视图移动时,可以根据当前可视视图的位置加载新图像,不在可视屏幕上的图像可以释放。

如果你使用UITableView,你可以看看这个,LazyTableImages

于 2012-07-22T09:01:00.067 回答