重复调用"GPUImagePicture ProcessImage"时由于内存警告而导致应用崩溃



我已经实现了一个组过滤器(GPUImageSepiaFilter, GPUImageExposureFilter, GPUImageSepiaFilter)用于图像编辑。我有一个滑块,用于设置自定义的"曝光"(setExposure:)值。在滑块的"didValueChanged"动作方法上,我通过调用"picture 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];    
}

解决这个问题的最好方法是什么?还是我做错了什么?

谢谢,

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

  • "磁盘"大小的图像它不代表真实的图像大小,这是因为它可能已经被压缩。当它在内存中解压缩并且系统必须处理它时,实际图像大小为:height*width*n°channel*n°bit_for_each_channel
  • 图片应该总是延迟加载,如果你不使用它们,把它们放在身边是没有用的
  • Brad在框架中对framebuffer重用做了巨大的改变,对内存的处理方式有了重大改进,你确定你使用的是github上的最新版本吗?
  • 您是否尝试使用分配工具配置应用程序,也许问题是在其他地方,使用此工具,您可以看到内存是否在您期望的地方增长
  • imageNamed方法缓存图像,即使他们说该内存将在内存压力情况下被驱逐,我也从未有机会看到清除工作

我没有看到任何错误与您的代码在使用GPUImage,但我会尝试使用较小的图像(像素大小),首先使用分配。

相关内容

最新更新