0

我已经实现了一个用于图像编辑的组过滤器(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];    
}

解决此问题的最佳方法是什么?还是我做错了什么?

谢谢,
斯里尼瓦斯

4

1 回答 1

2

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

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

在使用 GPUImage 时,我没有发现您的代码有任何问题,但我会尝试使用较小的图像(以像素为单位)并且首先使用分配。

于 2014-05-15T13:12:11.767 回答