Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 渲染60个图像导致内存警告_Ios_Uiimageview_Uigraphicscontext - Fatal编程技术网

Ios 渲染60个图像导致内存警告

Ios 渲染60个图像导致内存警告,ios,uiimageview,uigraphicscontext,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

我正在渲染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];
 }
-(无效)更改{
对于(int-aniCount=1;aniCount<60;aniCount++){
如果([UIScreen mainScreen].bounds.size.height==568){
self.renderString=[NSString stringWithFormat:@“%i_5.png”,一个计数+1];
self.imageView.image=[UIImage ImageName:@“1_5.png”];
}否则{
self.renderString=[NSString stringWithFormat:@“%i.png”,aniCount+1];
}
//下面是预渲染图像的代码
UIImage*frameImage=[UIImage ImageName:self.renderString];
UIGraphicsBeginImageContext(frameImage.size);
CGRect rect=CGRectMake(0,0,frameImage.size.width,frameImage.size.height);
[frameImage drawInRect:rect];
UIImage*RenderImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsSendImageContext();
[self.menuanimationImages添加对象:renderimage];
}
self.imageView.animationImages=[NSArray arrayWithArray:self.menuanimationImages];
}
此方法在my
-(void)viewDidLoad


应用程序屏幕的外观示例:

我们是否可以通过检查屏幕分辨率推断这些是全屏图像?如果是这样的话,用60幅图像制作一个全屏动画需要非常多的内存,我并不奇怪你会收到内存警告。在
UIImageView
中使用每个图像时,每个像素至少需要四个字节

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

一般来说,你不想动画使用许多全屏图像。你可能想考虑使用UIKIT动画或核心动画(或其他类似的技术)编程动画化视图。。或者,如果您确实需要使用一系列图像,请查看是否可以将动画部分约束到屏幕的较小部分,从而使用较小的图像并需要更少的内存

不知道动画是什么样子很难说。如果你描述动画(或给我们看一两张屏幕快照),我们可能会建议使用内存占用少得多的方法


在您的评论中,您分享了一个具有所需万花筒效果的示例。以下是一些想法:

  • 我首先将重点放在渲染万花筒效果的编程方法上。鉴于这里的复杂性,这可能会导致我研究渲染万花筒效果的“OpenGL ES”方法。您甚至可能会遇到一些现有的实现

  • 我注意到,
    CIKaleidoscope
    CITriangleKaleidoscope
    有一些核心图像过滤器,它们可能有助于生成您想要的效果(有关这两个过滤器的信息,请参阅)。我认为这两个过滤器不太合适,但请检查一下

  • 如果上述以编程方式呈现万花筒的尝试失败,我会想到,至少可以将当前实现的内存需求减少四倍,因为万花筒效果似乎是水平和垂直对称的。因此,理论上可以有一系列的im左上象限的年龄,然后将其他三个渲染为同一图像的变换

  • 或者,您也可以创建一个全屏视频并使用来播放它


  • 在我试图通过一系列的全屏图像来做动画之前,我可能会耗尽这些疑问。全屏幕图像只是一种记忆低效的方法来解决这类问题,而且你几乎肯定会遇到挑战。如果你考虑过iPad的应用,或者想考虑。较长的序列,一系列全屏图像的方法可能是完全站不住脚的。

    所有60个图像是否都同时显示在屏幕上?如果是这样,则以所需的大小缓存图像,如果不只是绘制可见的图像。不会发生的是,一旦按下按钮,imageview会改变显示每个图像的方式动画中的图像,一次一个。你的建议很好,但我对缓存不是很有经验。你能建议吗?这里有一篇关于缓存的相关帖子:不要一次渲染它们-简单;)你只需要1+几个就可以更快地浏览动画确实是全屏的,你是对的。它需要全屏,但我没有alt图像的大小是屏幕的大小。图像是非视网膜和视网膜的版本,一旦按下一个按钮,它就会通过所有的图像。几乎就像电影是如何制作的。它是应用程序的一个例子:@ GMN感谢分享视频链接。我肯定会考虑一个专业的。产生万花筒效果的语法方法。如果您在这些领域的研究没有产生结果,我建议您发布一个新问题,重点关注万花筒效果,概述您的研究和尝试,并征求关于如何进行的建议。但在我看来,一系列全屏图像可能永远不会出现一个富有成效的方法(虽然我理解你为什么开始使用它,因为它有一定的简单性)。谢谢你这么好的反馈!