1

GPUImage を使用すればするほど、時間の経過とともにアプリがより多くのメモリを消費することに気付きました (Instruments を使用してメモリ使用量を監視します)。

例として、各フィルターを異なる方法で使用します。

 (UIImage*)ToonFilter:(UIImage*)theImage
    {
    GPUImageSmoothToonFilter *smoothToonFilter = [[GPUImageSmoothToonFilter alloc] init];
    [smoothToonFilter setTexelHeight:0.0025];
    [smoothToonFilter setTexelWidth:0.0025];
    return [smoothToonFilter imageByFilteringImage:theImage];
    }

    (UIImage*)SketchFilter:(UIImage*)theImage
    {
    GPUImageSketchFilter *sketchFilter = [[GPUImageSketchFilter alloc] init];
    [sketchFilter setTexelHeight:0.003];
    [sketchFilter setTexelWidth:0.003];
    return [sketchFilter imageByFilteringImage:theImage];
    }

    (UIImage*)PixellateFilter:(UIImage*)theImage
    {
    GPUImagePixellateFilter *pixellateFilter = [[GPUImagePixellateFilter alloc] init];
    [pixellateFilter setFractionalWidthOfAPixel:0.01;
    return [pixellateFilter imageByFilteringImage:theImage];
    }

そして、これは私がこれらのフィルターを使用する方法です (testImage は UIImage です):

testImage = [self SketchFilter:testImage];
testImage = [self PixellateFilter:testImage];

他に何もせずにこれらのフィルターを何度も繰り返すと、アプリはますます多くのメモリを消費します。

私は何を間違っていますか?不要になったメモリを解放するにはどうすればよいですか?

4

1 に答える 1

0

これらの関数を呼び出すたびに、新しいフィルターを割り当て続けます。ビュー コントローラーなどで一度作成し、以下のサンプル コードのような関数に送信します (GPUImagePicture と同様)。また、フィルターで [removeAllTargets] を呼び出すことを忘れないでください。ターゲットがある場合、フィルターがメモリから削除されないことがあります。

(UIImage*)PixellateFilter:(UIImage*)theImage withPixellateFilter:(GPUImagePixellateFilter *) pixellateFilter andStaticPicture:(GPUImagePicture *)staticPicture

また、フィルターから UIImage を取得する前に [filter prepareForImageCapture] を使用します

たとえば、次のように関数を構築できます

(UIImage*)PixellateFilter:(UIImage*)theImage withPixellateFilter:(GPUImagePixellateFilter *) pixellateFilter andStaticPicture:(GPUImagePicture *)staticPicture{
    [staticPicture removeAllTargets];
    UIImage __block *imageToReturn;
    [staticPicture addTarget:pixellateFilter];
    [staticPicture processImageWithCompletionHandler:^{
            [pixellateFilter prepareForImageCapture];
            imageToReturn = [pixellateFilter imageFromCurrentlyProcessedOutput];
            [pixellateFilter removeAllTargets];
            pixellateFilter = nil;
    }];
    return imageToReturn;
}

UIImageを取得せずにGPUImageFiltersとGPUImagePicturesを直接使用できるアプリケーションにGPUImageViewを使用しています。間違いなく検討する必要があります

于 2013-11-20T09:19:40.690 に答える