3

同様の質問を見つけるためにフォーラムを調べましたが、私の問題は異なるようです。私は GPUImage を使用しています。bash スクリプトを使用してフレームワークを構築しました。フィルターとそのチェーンを作成して処理するサンプルを見ました。しかし、私のアプリでは、メモリ消費量が常に増加しています。メモリ リークはありません。アプリをプロファイリングしました。

image - カメラから取得した画像です。以下のコードを 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 *)image { ......... [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 でしたが、何らかの理由でアプリが終了しました。これがどのように見えるかです: (私はスクリーンショットを配置し、デバイスからログを取り、Instruments からトレースさえしました)。私のアプリはTesseractSampleと呼ばれていますが、tesseractの使用を完全にオフにし、その初期化も行いました。

http://goo.gl/w5XrVb

デバイスからのログでは、最大許容 rpages が使用されていることがわかります。

http://goo.gl/ImG2Wt

しかし、私はそれが何を意味するのか見当がつきません。rpages == recent_max (167601)

4

0 に答える 0