我已经实现了一个组过滤器(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,但我会尝试使用较小的图像(像素大小),首先使用分配。