【问题标题】:GPUImage memory usageGPUImage内存使用情况
【发布时间】:2013-07-31 13:35:26
【问题描述】:

我注意到我使用 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];

如果我只是一遍又一遍地循环通过这些过滤器,而不做任何其他事情,应用程序会占用越来越多的内存。

我做错了什么?不再需要的内存如何释放?

【问题讨论】:

  • 您找到解决方法了吗?我遇到了同样的问题。

标签: objective-c memory gpuimage


【解决方案1】:

每次调用这些函数时,您都会不断分配新的过滤器。在您的视图控制器等中创建一次并将它们发送到您的函数,如下面的示例代码(以及 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;
}

我在我的应用程序中使用 GPUImageView,它允许您直接使用 GPUImageFilters 和 GPUImagePictures 而无需获取 UIImage,您绝对应该考虑它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-03
    • 2012-05-30
    • 2021-02-26
    • 2010-10-24
    • 2015-06-14
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多