Ios GPU内存崩溃与GPUImage

Ios GPU内存崩溃与GPUImage,ios,image,memory,image-processing,gpuimage,Ios,Image,Memory,Image Processing,Gpuimage,在过去的3天里,我一直在努力解决这个问题,但我不知道为什么/如何解决由于图像过滤导致的内存警告/崩溃 就这么简单:用户可以选择不同的过滤器,然后保存图片 我有不同的问题,我设法克服了,这里是我的最终代码(我删除了所有不重要的东西) 用户可以自由地在不同的过滤器上进行clic。如果他每3秒钟使用一次,它只会给出内存警告(使用空的iPhone4S,没有运行的应用程序)。如果他连续使用3个,应用程序将崩溃并发出内存警告 Xcode显示的内存大约为50米,考虑到我们正在处理一幅图像,这是可以的 我所尝试

在过去的3天里,我一直在努力解决这个问题,但我不知道为什么/如何解决由于图像过滤导致的内存警告/崩溃

就这么简单:用户可以选择不同的过滤器,然后保存图片

我有不同的问题,我设法克服了,这里是我的最终代码(我删除了所有不重要的东西)

用户可以自由地在不同的过滤器上进行clic。如果他每3秒钟使用一次,它只会给出内存警告(使用空的iPhone4S,没有运行的应用程序)。如果他连续使用3个,应用程序将崩溃并发出内存警告

Xcode显示的内存大约为50米,考虑到我们正在处理一幅图像,这是可以的

我所尝试的: -如果我在filter方法中alloc/init图像和过滤器,我会设法将其降低到8M。这意味着用户有很好的3秒延迟,并且仍然有内存警告。在filter方法的末尾,我将所有设置都设置为nil,这是一个中间过程:它不会返回到8M,有时会返回到8M,但大多数情况下,它只是叠加到40到75/80

  • 使用默认过滤器:它可以正常工作,但过滤图像大约需要10到15秒。我的用户将在他的图像被过滤时死亡,这是不可能做到的

  • 把一切都归零。尽管如此,在下一个视图中,Xcode内存显示约为70,这只是常规内存。因为我已经设法得到内存警告和崩溃只有8个,我很肯定的GPU内存也在红色

  • 缩小尺寸并压缩我正在处理的图像。变化不大。它将内存使用量(由Xcode显示)减少到大约45,但在3或4个过滤器之后,我仍然会收到非常相同的内存警告和崩溃

注意:如果我走得很慢,我真的可以做很多我想要的过滤器,我只得到内存警告,但没有崩溃


我愿意接受建议和问题,我完全没有想法。它实际上只是将最基本的过滤器应用于真正经典的图片。如有必要,我可以显示其他代码。

以下是我对您刚发给我的电子邮件的回复:

这里的一个大问题是,你要往返于UIImages。每次这样做时,都会分配一个非常大的映像,而不会给我的一些帧缓冲区优化提供运行的机会。这将导致较大的内存峰值,特别是当您将这些生成的图像设置为UIImageView并保留它们时

与其每次都要创建一个新的GPUImagePicture进行筛选,不如创建一次输入GPUImagePicture,然后使用addTarget:从中链接筛选。将UIImageView替换为GPUIImageView,并将过滤后的图像锁定在该位置。当您需要更新过滤器选项时,交换过滤器或在过滤器上设置新选项,然后在原始源图像上调用-processImage。这将使所有图像处理完全驻留在GPU上(速度快得多),并将大大提高内存效率


我还建议在链中的第一个过滤器上使用-forceProcessingAtSize:或-forceProcessingAtSizeRespectingAspectRatio:,并将其设置为视图的目标像素大小。以高于显示分辨率的分辨率处理图像毫无意义。这也将大大减少过滤时间和内存使用。当您需要将最终图像捕获到磁盘时,您可以将图像大小重置为0,0,以删除这些限制并获取完整分辨率的图像。

remove stillImageSource=[[GPUImagePicture alloc]initWithImage:_photo];在iAction中,您不必每次都初始化..哦,是的,对不起。正如我在问题中所说的,我每次都尝试过使用和不使用缩写。我的错误是,我应该首先展示最优化的代码。我来编辑!感谢您使用的Xcode的哪个版本。图像的大小和格式是什么。您是否尝试更新GPUImage。是否在信息列表中启用openGL 2.0<代码>opengles-2Xcode版本:6.0.1。图像经过这个流程:全尺寸->大小调整为816*1088->压缩为JPEG 0.4比率->更改为PNG->加载到imgView中。我的GPUImage版本应该是git的最新版本,我有一个大约2周大。我正在检查plistHmm中的OpenGL,我是否应该在plist文件中所需的设备功能中添加“opengles-2”?是的,谢谢!事实上,我正在通读它,我会让你知道:)顺便说一句,谢谢你的合作和帮助!好吧,它确实工作得更好!我仍然需要弄清楚如何使我的图像“方面适合”,而不是真的很小,但我可以自己弄清楚!谢谢布拉德,祝你有愉快的一天!
- (void)viewDidLoad{

// Setting up the filter chain, it's better to do it now to avoid lags 
// if we had done it in the "filter" methods, about 3 sec lag.

    stillImageSource = [[GPUImagePicture alloc]initWithImage:_photo];
    GPUImageBrightnessFilter *soft;
    GPUImageContrastFilter *medium;
    soft = [[GPUImageBrightnessFilter alloc]init];
    medium = [[GPUImageContrastFilter alloc]init];
    soft.brightness = -0.5;
    medium.contrast = 1.6;
}
- (IBAction)mediumFilter:(id)sender {

    [stillImageSource addTarget:medium];
    [medium useNextFrameForImageCapture];
    [stillImageSource processImage];

    //[medium endProcessing];   // Not sure what this does but i've seen it around.

    [self.imgPicture setImage:[medium imageFromCurrentFramebuffer]];
    [stillImageSource removeAllTargets];
}

- (IBAction)denseFilter:(id)sender {

    [stillImageSource addTarget:soft];
    [soft addTarget:medium];
    [medium useNextFrameForImageCapture];
    [stillImageSource processImage];

    //[soft endProcessing];
    //[medium endProcessing];  // Not sure what this does but i've seen it around.

    [self.imgPicture setImage:[medium imageFromCurrentFramebuffer]];
    [stillImageSource removeAllTargets];

}

- (IBAction)softFilter:(id)sender {

    [stillImageSource addTarget:soft];
    [soft useNextFrameForImageCapture];
    [stillImageSource processImage];

    //[soft endProcessing];

    [self.imgPicture setImage:[soft imageFromCurrentFramebuffer]];
    [stillImageSource removeAllTargets];


}