1

我正在渲染 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

4

1 回答 1

2

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

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

通常,您不希望使用那么多全屏图像进行动画处理。您可能会考虑使用 UIKit 动画或核心动画(或其他类似技术)以编程方式为视图设置动画。或者,如果您确实必须使用一系列图像,请查看是否可以将动画部分限制在屏幕的较小部分,从而使用较小的图像并需要更少的内存。

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


在您的评论中,您分享了一个视频链接,该视频具有所需的万花筒效果。几个想法:

  1. 我将首先关注渲染万花筒效果的程序化方法。考虑到这里的复杂性,这可能会导致我研究“OpenGL ES”方法来渲染这种万花筒效果。您甚至可能会遇到一些现有的实现。

  2. 我注意到有一些 Core Image 过滤器CIKaleidoscopeCITriangleKaleidoscope这可能有助于生成您正在寻找的效果(有关这两个过滤器的信息,请参阅Core Image Filter Reference)。我认为这些不会完全正确,但是请检查一下。

  3. 上述尝试以编程方式渲染万花筒的尝试失败,我觉得至少可以将当前实现的内存需求减少四倍,因为万花筒效果似乎是水平和垂直对称的。所以理论上你可以有一个左上象限的图像序列,然后将其他三个渲染为同一图像的变换。

  4. 或者您也可以创建一个全屏视频并使用媒体播放器框架来播放它。

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

于 2014-02-07T17:36:18.573 回答