重复调用“GPUImagePicture ProcessImage”时由于内存警告导致应用程序崩溃

时间:2014-05-15 11:36:47

标签: ios memory-management gpuimage gpuimagestillcamera

我已经实现了一个用于图像编辑的组过滤器(GPUImageSepiaFilter,GPUImageExposureFilter,GPUImageSepiaFilter)。我有一个滑块用于设置自定义"曝光" (setExposure :)值。在" didValueChanged"滑块的动作方法,我通过调用"图片processImage"来刷新图像预览。如果我非常快地移动滑块或重复滚动滑块,应用程序会因内存问题而崩溃。

- (void)viewDidLoad  {
    [super viewDidLoad];

    self.originalPicture = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"IMG_0009.JPG"]];

    self.filterGroup = [[GPUImageFilterGroup alloc] init];

    GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
    [self.filterGroup addFilter:sepiaFilter];

    GPUImageExposureFilter *pixellateFilter = [[GPUImageExposureFilter alloc] init];
    [pixellateFilter setExposure:0.0f];
    [self.filterGroup addFilter:pixellateFilter];

    GPUImageSaturationFilter *saturation = [[GPUImageSaturationFilter alloc] init];
    [self.filterGroup addFilter:saturation];

    [sepiaFilter addTarget:pixellateFilter];
    [pixellateFilter addTarget:saturation];

    [self.filterGroup setInitialFilters:[NSArray arrayWithObjects:sepiaFilter, pixellateFilter,nil]];
    [self.filterGroup setTerminalFilter:saturation];

    [self.originalPicture addTarget:self.filterGroup];


    GPUImageView *filterView = [[GPUImageView alloc] init];
    self.view = filterView;

    [self.filterGroup addTarget:filterView];

    [self.originalPicture processImage];

    [self.slider setMinimumTrackTintColor:[UIColor redColor]];
    [self.slider setMaximumTrackTintColor:[UIColor greenColor]];
    [self.view addSubview:self.slider]; 
}

- (IBAction)didChangeValue:(id)sender {
    GPUImageExposureFilter *filter = (GPUImageExposureFilter *)[self.filterGroup filterAtIndex:1];

    [filter setExposure:self.slider.value];
    [self.originalPicture processImage];    
}

哪种方法可以解决这个问题?或者我做错了什么?

谢谢,
SRINIVAS

1 个答案:

答案 0 :(得分:2)

我只是关于图像和GPUImage的一些建议:

  • “磁盘”大小的图像,它不代表真实的图像大小,因为它可能已被压缩。真实的图像大小,当它在内存中解压缩并且系统需要处理它时:height*width*n°channel*n°bit_for_each_channel
  • 图像应该总是懒洋洋地加载,如果你不使用它们是无用的
  • Brad在其框架中对帧缓冲重用进行了重大改动,这对于内存处理方式有了重大改进,你确定你在github上使用的是最后一个版本吗?
  • 您是否尝试使用分配工具分析应用程序,可能问题出在其他地方,使用此工具可以看到内存是否增长到您期望的位置
  • imageNamed方法缓存图像,即使他们说这个内存会在内存压力情况下被驱逐,我也没有机会看到清除工作

我在使用GPUImage时没有看到你的代码有什么问题,但我会尝试使用较小的图像(像素大小),首先使用分配。