UIImage+;iOS 7模糊效果减缓应用程序速度的效果-450MB?

UIImage+;iOS 7模糊效果减缓应用程序速度的效果-450MB?,ios,iphone,memory,uiimage,grand-central-dispatch,Ios,Iphone,Memory,Uiimage,Grand Central Dispatch,这就是我如何使用UIImage+Effects模糊名为artworkImage的UIImage,以获得iOS 7模糊效果的方法: -(void)viewDidAppear:(BOOL)animated{ MPMediaItem *currentItem = [self.musicPlayer nowPlayingItem]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0u

这就是我如何使用
UIImage+Effects
模糊名为
artworkImage
的UIImage,以获得iOS 7模糊效果的方法:

-(void)viewDidAppear:(BOOL)animated{

    MPMediaItem *currentItem = [self.musicPlayer nowPlayingItem];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^(void) {
        @autoreleasepool {

            MPMediaItemArtwork *artwork = [currentItem valueForProperty: MPMediaItemPropertyArtwork];
            UIImage *artworkImage = [artwork imageWithSize: CGSizeMake (618, 618)];

            artworkImage = [artworkImage applyDarkEffect];

            dispatch_async(dispatch_get_main_queue(), ^{

                [backgroundImageView setImage:artworkImage];

                UIGraphicsEndImageContext();
            });
        }
    });
}
我的应用程序真的很慢,所以我研究了如何找出原因,然后我遇到了仪器,这向我展示了:

所以我进一步研究了如何解决这个问题,遇到了
dispatch\u async
,所以我把实际的模糊处理放到了后台,并在前面更新了UI。它仍然非常慢

每当音乐播放器跳过歌曲时,这个名为
artworkImage
UIImage
就会更新。我将苹果示例项目中的iOS 7模糊效果(称为
UIImage+Effects.h
)应用于此UIImage

请告诉我该怎么做-我已经搜索了无数的线程,它们都说使用
自动释放
,当然我不能使用ARC

非常感谢您的帮助。

我正在使用Stackblur


非常易于使用,优化效果也很好。

这里最可能发生的情况是,您正在通过上述处理构建一系列UIImage,导致应用程序最终耗尽内存并崩溃

苹果的
UIImage+Effects
category使用一系列方框模糊来模糊CPU端。这不是世界上最快的过程。除此之外,创建UIImage可能很慢,将UIImage设置为UIImageView进行显示也是如此。几乎所有这些都是在CPU上完成的,而不是在GPU上

因此,如果每次更新UI元素时都触发上述方法,则首先将一系列块分配到默认后台队列,然后异步分配到主队列。后者最有可能发生在内存累积的地方,因为那里的每个块都会保留其中的对象。如果处理和UIImageView更新所需的时间超过了触发上述方法的时间间隔,则您将在调度队列中构建块,并且这些块中的每个块都将包含UIImages。这将很快导致内存累积和崩溃

有两种方法可以做到这一点。首先,您可以使用分派信号量来确保后台队列上每次只运行一个块。我描述了一个用于此的过程。这将防止记忆积累,但可能无助于模糊速度


为此,你可以看看苹果提供的模糊分类的替代品。我的开源GPUImage框架有一个GPU加速模糊。如果你需要它的深色变体,我会谈谈如何修改它。进出UIImages仍然很慢,但是通过将模糊通过管道传输到GPUImageView而不是UIImageView,您至少可以替换这里慢处理的后半部分。直接过滤到GPUImageView进行显示会将所有内容保留在GPU上。

使用
dispatch\u async
在单独的线程中运行某些内容不会减少它使用的RAM数量。更改图像后,内存使用量是否会保持在450MB?知道这一点可能有助于指出是什么导致了它。CPU的使用情况如何?我还假设您没有尝试过任何dispatch_async东西,但如果您没有,我会尝试。这句话毫无意义:“它仍然非常慢(450MB)”。“慢”是一种速度。“450MB”是一个大小。使用“DISPATCH\u QUEUE\u PRIORITY\u DEFAULT”肯定会减慢速度,因为你说的是“随时在后台执行”。@matt我可能是错的,但我认为这在这种情况下不会有什么区别,除非有其他线程占用大量CPU周期。它也不能解释RAM的大量使用。它仍然非常滞后,有时甚至无法加载。另外,苹果的UIImage+效果同时会使图像变暗,这正是我想要的:)谢谢你的帮助。我试图实现你的GPUImage,但是图像没有模糊。另外,我将如何在上面的方法中使用分派信号量?我尝试了很多方法,但我认为我不太明白。@user3127576-您在上面的代码中使用了深褐色色调过滤器,所以它当然不会使图像模糊。您需要使用上面提到的GPUImageiOSBlurFilter或标准高斯滤波器。我在信号量回答中提供了一些示例代码,您可以在这里应用这些代码。它应该是普遍适用的。如果你不明白那里发生了什么,不妨看看迈克·阿什(Mike Ash)在这里发表的伟大GCD文章:噢!谢谢,模糊现在很好用了,谢谢:)我只是在努力让它变暗?我在gpuimageiosfulfilter.m中找到了GPUImageLuminanceRangeFilter,但我不确定该做什么change@user3127576-查看kGPUImageLuminanceRangeFragmentShaderString常量,该常量是定义该操作的片段着色器的位置。数学是用C语言编写的,你需要调整它,直到达到你想要的效果。迭代应该不会太困难,直到你让它与你需要的颜色完全一致,然后将代码复制到这个过滤器的自定义深色版本,你可以使用它而不必修改框架代码本身。有几个人已经这样做了,但还没有人将其作为拉取请求发回。我不明白为什么UIImages在修改后会使用450MB的RAM。可能是内存泄漏了。