0

我有一个包含 150 个本地图像(每个大约 500kb)的应用程序。我已将它们全部加载到这样的数组中:

allPics = [[NSMutableArray alloc] init];

//NSString *imagePath;
NSArray *result = [database performQuery:@"SELECT image_path FROM validWords order by valid_word"];
for (NSArray *row in result) {
    NSString *temp = [row objectAtIndex:0];
    NSLog(@"%@", temp);
    //imagePath = temp;
    UIImage *newImage = [UIImage imageNamed:temp];

    [allPics addObject:newImage];
}

当我稍后将我的 UIImageView 设置为其中一张图片时,由于从我阅读的内容中延迟加载,它会挂起我的界面一秒钟。我试图预渲染它们,但是在它通过我的图像的三分之一之前,我的内存使用量超过了 3gb。我是否应该在需要时使用后台线程来渲染图像?当我将图像总数减少到 4 个时,一旦所有 4 个都被渲染一次,它们之间的过渡是无缝的。

我感谢任何和所有提示和解决方案!

4

1 回答 1

1

是的,我建议使用后台线程和分页。如果用户正在查看图像 7,您应该加载图像,例如 5、6、8 和 9。如果用户然后移动到图像 8,您可以丢弃图像 5 并延迟加载图像 10。这样用户应该能够在没有显着内存或性能开销的情况下移动图像。

然后,您还可以添加启发式方法,例如“如果用户非常快速地翻阅图像,请不要加载任何图像,直到它们变慢”,

另一个技巧是存储图像的分辨率非常低的版本(例如,50kb 版本)并将其存储在不同的路径中。然后,您可以向用户显示缩略图图像,并且如果用户在该图像上停留一段时间,则仅延迟加载高分辨率图像。

最后,在谈论图像大小时要小心。500KB 是压缩的还是未压缩的?如果是 500KB 压缩的 JPeg,设备上的实际图像可能会大得多。具有相当均匀的颜色和相当高的压缩水平的 jpg 在磁盘上可能非常小,但解压缩后它可能是一个巨大的图像。这可能是您遇到的滞后的另一个来源。

于 2013-10-03T01:15:47.433 回答