我查看论坛以找到类似的问题,但似乎我的问题不同。 我正在使用GPUImage,我使用bash脚本构建了框架。我查看了创建过滤器的示例。他们的加工链。 但在我的应用程序中,我面临着内存消耗的不断增加。没有内存泄漏,我描述了我的应用程序。
图像 - 是从相机拍摄的图像。我将下面描述的代码称为for循环。我确实看到内存增加从7MB开始增加到150MB,此时应用程序终止了。
以下是代码:
- (void)processImageInternal:(UIImage *)image
{
GPUImagePicture * picture = [[GPUImagePicture alloc]initWithImage:image];
GPUImageLanczosResamplingFilter *lanczosResamplingFilter = [GPUImageLanczosResamplingFilter new];
CGFloat scale = image.scale;
CGSize size = image.size;
CGFloat newScale = roundf(2*scale);
CGSize newSize = CGSizeMake((size.width *scale)/newScale,(size.height *scale)/newScale);
[lanczosResamplingFilter forceProcessingAtSize:newSize];
[picture addTarget:lanczosResamplingFilter];
GPUImageGrayscaleFilter * grayScaleFilter = [GPUImageGrayscaleFilter new];
[grayScaleFilter forceProcessingAtSize:newSize];
[lanczosResamplingFilter addTarget:grayScaleFilter];
GPUImageMedianFilter * medianFilter = [GPUImageMedianFilter new];
[medianFilter forceProcessingAtSize:newSize];
[grayScaleFilter addTarget:medianFilter];
GPUImageSharpenFilter * sharpenFilter = [GPUImageSharpenFilter new];
sharpenFilter.sharpness +=2.0;
[sharpenFilter forceProcessingAtSize:newSize];
[medianFilter addTarget:sharpenFilter];
GPUImageGaussianBlurFilter * blurFilter = [GPUImageGaussianBlurFilter new];
blurFilter.blurSize = 0.5;
[blurFilter forceProcessingAtSize:newSize];
[sharpenFilter addTarget:blurFilter];
GPUImageUnsharpMaskFilter * unsharpMask = [GPUImageUnsharpMaskFilter new];
[unsharpMask forceProcessingAtSize:newSize];
[blurFilter addTarget:unsharpMask];
[picture processImage];
image = [unsharpMask imageFromCurrentlyProcessedOutput];
}
代码在后台线程中执行。
这是调用代码:
for (NSUInteger i=0;i <100;i++)
{
NSLog(@" INDEX OF I : %d",i);
[self processImageInternal:image];
}
我甚至在- (void)processImageInternal:(UIImage *)image
方法中添加了一些清理逻辑
- (void)processImageInternal:(UIImage *)图像
{
.........
[picture processImage];
image = [unsharpMask imageFromCurrentlyProcessedOutput];
//clean up code....
[picture removeAllTargets];
[self releaseResourcesForGPUOutput:unsharpMask];
[self releaseResourcesForGPUOutput:blurFilter];
[self releaseResourcesForGPUOutput:sharpenFilter];
[self releaseResourcesForGPUOutput:medianFilter];
[self releaseResourcesForGPUOutput:lanczosResamplingFilter];
[self releaseResourcesForGPUOutput:grayScaleFilter];
在发布方法中,基本上我发布了可能发布的内容:FBO,纹理,目标。这是代码:
- (void)releaseResourcesForGPUOutput:(GPUImageOutput *) output
{
if ([output isKindOfClass:[GPUImageFilterGroup class]])
{
GPUImageFilterGroup *group = (GPUImageFilterGroup *) output;
for (NSUInteger i=0; i<group.filterCount;i++)
{
GPUImageFilter * curFilter = (GPUImageFilter * )[group filterAtIndex:i];
[self releaseResourcesForGPUFilter:curFilter];
}
[group removeAllTargets];
}
else if ([output isKindOfClass:[GPUImageFilter class]])
{
[self releaseResourcesForGPUFilter:(GPUImageFilter *)output];
}
}
对GPU组过滤器进行非锐化掩码,即过滤器的复合。
- (void)releaseResourcesForGPUFilter:(GPUImageFilter *)filter
{
if ([filter respondsToSelector:@selector(releaseInputTexturesIfNeeded)])
{
[filter releaseInputTexturesIfNeeded];
[filter destroyFilterFBO];
[filter cleanupOutputImage];
[filter deleteOutputTexture];
[filter removeAllTargets];
}
}
我按照Brad的建议做了:我的代码是在UI触摸处理循环中调用的。自动化的池对象被耗尽,但是从Allocation Instruments我看不到任何奇怪的东西。但是我的申请被终止了。 最终总分配为130 MB,但由于某些原因我的应用程序被终止。 这是它的样子:(我放置了屏幕截图,从设备登录,甚至从仪器跟踪)。我的应用程序名为TesseractSample,但我完全关闭了tesseract的使用,甚至是'初始化'。
在设备日志中,我看到使用了最大允许值:
但我不知道这意味着什么。 rpages == recent_max(167601)