GPUImage有没有内存问题?下面是两个不同的渐晕滤镜效果代码。第一个(苹果的CI过滤器)使用19MB内存,而GPUImage使用超过75MB内存。我的代码出了什么问题?
使用CIFilter的Vignette滤镜
CIImage *ciImage = [[CIImage alloc] initWithImage:image];
CIFilter *filter = [CIFilter filterWithName:@"CIVignetteEffect" keysAndValues:kCIInputImageKey, ciImage, nil];
CIContext *context = [CIContext contextWithOptions:nil];
CIImage *outputImage = [filter outputImage];
CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *result = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
return result;
下面是GPUImage版本:
GPUImageFilter * f = [[GPUImageVignetteFilter alloc] init];
UIImage *result = [f imageByFilteringImage:image];
return result;
我在我的项目中使用了"ARC“。你有什么想法吗?我应该怎么做才能“释放”GPUImage过滤器内存?
发布于 2014-01-03 22:42:13
对于上述代码中的GPUImage方法,内存中将简短地存在图像的四个副本:原始UIImage及其字节、该图像在图形处理器上被上传到的纹理、过滤操作的结果以及作为该操作的结果而创建的UIImage及其字节。
上面使用的方便方法可能很简单,但它们在减少内存压力方面并不是最好的。相反,我会尝试如下所示:
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:image smoothlyScaleOutput:NO];
GPUImageVignetteFilter *vignetteFilter = [[GPUImageVignetteFilter alloc] init];
[stillImageSource addTarget:vignetteFilter];
[stillImageSource prepareForImageCapture];
[stillImageSource processImage];
UIImage *result = [vignetteFilter imageFromCurrentlyProcessedOutput];
根据您的原始UIImage是如何创建的,您可能希望在创建原始UIImage的同时,将其中的第一行包装在@autoreleasepool中。第一行之后不再需要原始UIImage,因此在任何给定时间,内存中最多应该有两个图像。
-prepareForImageCapture
位是一种优化,可使由此返回的UIImage与过滤器的输出纹理共享内存映射。这消除了对最后一个图像副本的需要,但它确实会将过滤器锁定到UIImage,并且如果您尝试重用该过滤器或UIImage,可能会导致奇怪的行为。我也不能完全确定当过滤器在其内存映射的UIImage之前被释放时,是否所有的内存都被释放了,所以在该方法的末尾将图像编码为JPEG或PNG,并且只传递该图像的NSData表示可能会更安全。
https://stackoverflow.com/questions/20792216
复制相似问题