GPUImage缓慢记忆累积

时间:2013-10-09 09:25:12

标签: ios gpuimage

我查看论坛以找到类似的问题,但似乎我的问题不同。 我正在使用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的使用,甚至是'初始化'。

http://goo.gl/w5XrVb

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

http://goo.gl/ImG2Wt

但我不知道这意味着什么。 rpages == recent_max(167601)

0 个答案:

没有答案