Ios GPUImage内存缓慢积累

Ios GPUImage内存缓慢积累,ios,gpuimage,Ios,Gpuimage,我在论坛上寻找类似的问题,但似乎我的问题是不同的。 我使用GPUImage,我使用bash脚本构建框架。我查看了创建过滤器的示例及其处理链。 但在我的应用程序中,我面临着不断增加的内存消耗。没有内存泄漏,我分析了我的应用程序 图像-是从相机拍摄的图像。我在for循环中调用下面描述的代码。我确实看到了内存从7MB增加到150MB,然后应用程序被终止 代码如下: - (void)processImageInternal:(UIImage *)image { GPUImagePicture *

我在论坛上寻找类似的问题,但似乎我的问题是不同的。 我使用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];
}
在release method中,基本上我发布了所有可能发布的内容: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];
  }
}
我按照Brad的建议做了:我的代码是在UI触摸处理循环中调用的。自动恢复的池对象被排空,但从分配工具中我看不到任何奇怪的东西。但是我的申请被终止了。 最后分配的总容量为130MB,但由于某些原因,我的应用程序被终止。 下面是它的样子:(我放置了屏幕截图,设备日志,甚至仪器的跟踪)。我的应用程序名为TesseractSample,但我完全关闭了tesseract的使用,甚至“初始化”

在设备日志中,我看到使用了最大允许RPage:


但我不知道这意味着什么。rpages==最近的_max(167601)

摄像头的图像是从iOS的UIImagePickerController接收的。代码在iPhone 4S(iOS 7.0.2)和iPhone 5(iOS 5.1)上进行了测试,其行为是相同的。请尝试在按下按钮时触发-processImageInternal:方法,然后在分配工具中运行应用程序,每次你按那个按钮后都要拍一张大照片。这应该会揭示内存中积累的内容。非常感谢Brad,我按照你的建议做了,我不了解结果(我的意思是,在这些操作之前,你需要在常规点标记堆,看看积累了什么。在你的Instruments屏幕截图中,你看到屏幕左侧的按钮了吗“标记生成“?将上面时间线中的跟踪头移动到时间线中每个大峰值后的右侧,然后单击该按钮标记该点的堆。在每个峰值后执行此操作。分配工具将告诉您在每次操作后累积了哪些对象,这将有助于识别任何堆积。
- (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];
  }
}
- (void)releaseResourcesForGPUFilter:(GPUImageFilter *)filter
{
  if ([filter respondsToSelector:@selector(releaseInputTexturesIfNeeded)])
  {
    [filter releaseInputTexturesIfNeeded];
    [filter destroyFilterFBO];
    [filter cleanupOutputImage];
    [filter deleteOutputTexture];
    [filter removeAllTargets];
  }
}