UIImageView动画消耗太多内存

时间:2016-02-03 14:47:23

标签: ios objective-c animation memory uiimageview

我的内存和图像存在问题,我正在制作动画。首先,我使用的是ARC。在我的初始屏幕上,我有大约60张动画图像。我正在使用此代码进行动画:

NSMutableArray *images = [[NSMutableArray alloc] init];
int animationImageCount = 61;
for (int i = 1; i < animationImageCount; i++) {
    [images addObject:[UIImage imageNamed:[NSString stringWithFormat:@"s-%d", i]]];
}
self.fullAnimatedImage = [UIImage imageNamed:[NSString stringWithFormat:@"s-%d", animationImageCount - 1]];

self.animatedImageView.image = self.fullAnimatedImage;
self.animatedImageView.animationImages = [NSArray arrayWithArray:images];
self.animatedImageView.animationDuration = images.count/30;
self.animatedImageView.animationRepeatCount = 1;
[self.animatedImageView startAnimating];

// since there is no official callback method when UIImageView animation completes,
// we can just call a method after animation time has passed
[self performSelector:@selector(animationFinished) withObject:nil
           afterDelay:self.animatedImageView.animationDuration];

问题是内存消耗大约为300 MB,当然它在iPhone 4上崩溃。当我注释掉那部分代码时,内存消耗大约是40 MB,这没关系。我已经尝试将图像属性设置为零并且没有。我试图把它放在@autoreleasepool {}中,但它没有发布它的内容。你知道如何优化它吗?

4 个答案:

答案 0 :(得分:3)

您应尝试将[UIImage imageNamed:]替换为[UIImage imageWithContentsOfFile:]

来自文档:

  

如果您的图像文件只显示一次并希望确保它不会添加到系统的缓存中,则应使用imageWithContentsOfFile创建图像:这会将您的一次性图像保留在系统图像缓存之外,从而可能会改善应用程序的内存使用特性。

答案 1 :(得分:0)

您正在加载的每个图像有多大(像素方式和文件大小明智)?

您最好的选择是优化图像以减少文件大小/内存要求。如果你还没有尝试使用jpg而不是png。如果它们是视频序列的一部分,您可以安全地进一步降低其质量,而不会降低感知质量。

答案 2 :(得分:0)

所以过了一段时间,我决定走另一条路。从60张图片中,我创建了10张图片。我没有每个对象的每个图像,但是所有对象都有一个图像。例如,如果您有3辆汽车,每辆汽车的图像,以及另外n个图像用于向左移动每三个点,那么现在是所有三辆汽车的一张图像。对于相同的对象,我创建了一个完整的图像。之后,我为每个图像创建了图像视图。我需要知道每个图像是什么是图像对象的最终位置。例如,汽车从右到左。所以我把我的所有车的一张图片放在了右边的视线范围内。这是每个其他图像的逻辑。之后,我只是动画UIImageViews的位置。我希望它对某人有帮助。

答案 3 :(得分:0)

代码中的问题在于基本方法。您根本无法同时将所有已解码的图像保存在内存中。我写了一篇关于这个主题的特定博客文章,你可以阅读here。解决方案是使用不同的方法,这样您一次只能在内存中保存1帧解码图像数据。这意味着需要根据需要动态加载数据帧。