渲染60张图像导致内存警告

时间:2014-02-07 17:00:08

标签: ios uiimageview uigraphicscontext

我正在渲染60张图像并收到内存警告。我的代码有更好的方法吗?

- (void)change{
    for (int aniCount = 1; aniCount < 60; aniCount++) {
        if ([UIScreen mainScreen].bounds.size.height == 568) {
           self.renderString = [NSString stringWithFormat: @"%i_5.png", aniCount + 1];
           self.imageView.image = [UIImage imageNamed:@"1_5.png"];
        }else{
            self.renderString =  [NSString stringWithFormat: @"%i.png", aniCount + 1];
        }
        // here is the code to pre-render the image
        UIImage *frameImage = [UIImage imageNamed:self.renderString];
        UIGraphicsBeginImageContext(frameImage.size);
        CGRect rect = CGRectMake(0, 0, frameImage.size.width, frameImage.size.height);
        [frameImage drawInRect:rect];
        UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();

        [self.menuanimationImages addObject:renderedImage];
    }

    self.imageView.animationImages = [NSArray arrayWithArray: self.menuanimationImages];
 }

此方法在我的- (void)viewDidLoad

中调用

应用程序屏幕的示例:https://www.youtube.com/watch?v=2f80UcLhOW8

1 个答案:

答案 0 :(得分:2)

我们是否从屏幕分辨率的检查中推断出这些是全屏图像?如果是这样,要制作一张包含60张图像的全屏动画需要非常大的内存,而且我不会惊讶于你会收到内存警告。每个图像在UIImageView中使用时,每个像素至少需要四个字节。

对于4英寸屏幕上的非视网膜图像,60张全屏图像需要大约42mb。如果是视网膜图像(分辨率的两倍),则跳到166mb。不要看PNG的大小考虑使用的内存量时文件,因为PNG文件有一些压缩,但是当你在你的应用程序中使用它们时它们将被解压缩。

通常你不想动画使用那么多全屏图像。您可能希望使用UIKit动画或Core Animation(或其他类似技术)以编程方式为视图设置动画。或者,如果你真的必须使用一系列图像,看看你是否可以将动画部分约束到屏幕的一小部分,从而使用更小的图像并且需要更少的内存。

如果不知道动画的样子,很难说。如果您描述动画(或向我们展示一两个屏幕快照),我们可能会建议更少的内存密集型方法。


在您的评论中,您分享了link to a video,其中包含所需的千变万化效果。几点想法:

  1. 我首先关注的是以编程方式渲染千变万化的效果。考虑到这里的复杂性,这可能会让我研究“OpenGL ES”方法来渲染这种千变万化的效果。您甚至可能会对某些现有的实施进行操作。

  2. 我注意到CIKaleidoscopeCITriangleKaleidoscope的核心图像过滤器可能对生成您正在寻找的效果很有用(有关详细信息,请参阅Core Image Filter Reference那两个过滤器)。我不认为这些会在这里完全正确,但工作结束了。

  3. 如果没有上述尝试以编程方式呈现万花筒,那么至少,你可以将当前实现的内存需求降低四倍,因为万花筒效果似乎是水平和垂直对称。因此,理论上你可以为左上象限设置一系列图像,然后将其他三个图像渲染为同一图像的变换。

  4. 或者您可以创建全屏视频并使用media player framework进行播放。

  5. 在我通过一系列全屏图像进行动画制作之前,我可能会耗尽这些探究线。全屏图像只是解决此类问题的记忆效率低下的方式,而且几乎可以肯定会遇到挑战。如果您考虑过对应用程序进行iPad再现或想要考虑更长的序列,那么一系列全屏图像的方法可能完全站不住脚。