作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用此代码使用 GPUImage 生成 5 个模糊图像,似乎有大约 20MB 的内存累积从未被释放。我做错了什么吗?
这是我的代码:
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
GPUImageFastBlurFilter *blurFilter = [[GPUImageFastBlurFilter alloc] init];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:[image copy]];
[stillImageSource addTarget:blurFilter];
CGFloat maxBlur = 12.0;
for (int i=0; i < BLUR_STEPS; i++) {
if (!self.stopBlurOperation) { //stops blur operation on close
UIImageView *imageView;
if (i < self.blurredImageViews.count) {
imageView = (UIImageView *)self.blurredImageViews[i];
blurFilter.blurRadiusInPixels = maxBlur * (i+1) / BLUR_STEPS;
[blurFilter useNextFrameForImageCapture];
[stillImageSource processImage];
UIImage *blurredImage = [blurFilter imageFromCurrentFramebuffer];
dispatch_async( dispatch_get_main_queue(), ^{
[imageView setImage:blurredImage];
});
blurredImage = nil;
}
}
}
[blurFilter removeAllTargets];
[stillImageSource removeAllTargets];
[GPUImageContext setActiveShaderProgram:nil];
blurFilter = nil;
stillImageSource = nil;
});
最佳答案
首先,您似乎使用的是旧版本的框架,因为 GPUImageFastBlurFilter 已经几个月不存在了。存储库中的最新代码使用新的帧缓冲区缓存内存模型,该模型在大多数应用程序中显着提高了效率。
其次,这是运行多个模糊 channel 的极其低效的方式。往返 UIImages 需要将数据传入和传出 GPU,这很慢,并且还需要使用 Core Graphis 进行重绘,这甚至更慢。同样,过去几个月框架中的代码可以有效地生成大半径模糊,而不会出现您以前可能见过的任何伪影,从而无需上述循环。
最后,您在上面运行了一个紧密循环,并在循环中的每次传递时生成至少一个自动释放的 UIImage。如果没有自动释放池在某处耗尽,您将在循环运行时继续在内存中构建它们。但是,正如我所说,如果您只需更新到存储库中的最新代码,您就可以删除所有这些,而不必担心内存积累。
关于ios - GPUImage内存积累,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574520/
我有一个应用程序不断从 TCP/IP 端点接收 XML 消息流。收到每条消息后,应用程序将其内容消化到一组核心数据实体中。这是通过三个上下文结构实现的: 大师(私有(private)队列) Main(
boost docs以此作为如何使用 boost::accumulate 的示例: // The data for which we wish to calculate statistical pro
我是一名优秀的程序员,十分优秀!