【发布时间】:2015-02-06 00:59:28
【问题描述】:
我正在向 iOS 上录制视频的帧图像添加失真效果。对于分辨率为 640 x 640 的 14 秒视频,应用程序因内存错误而崩溃。我认为所有内存都被正确释放了。
我觉得很奇怪,分析器告诉我应用程序最大消耗大约 20 MB!我也找不到内存泄漏。 CoreImage 库在整个处理过程中确实积累了大约 580 MB 的内存,但内存在处理完每个帧后都会释放,因此不会导致崩溃。
如果我将失真过滤器注释掉,一切正常,所以我假设错误在过滤部分。我正在安装 iOS 8 的 iPhone 5s 上进行测试。
这是 GPUImage 中的错误吗? 为什么我无法分析过多的内存消耗?
感谢每一个回答! :)
这是相关的代码:
- (CIImage *) render:(CIImage*)targetImage imageContext:(CIContext*) imageContext
facialFeatures:(NSArray*)facialFeatures currentFrameInd:(int)frameInd
{
if ( !facialFeatures ) return targetImage;
@autoreleasepool {
CGImageRef inputImage = [imageContext createCGImage:targetImage fromRect:[targetImage extent]];
GPUImagePicture *sourcePicture = [[GPUImagePicture alloc] initWithCGImage:inputImage];
GPUImageOutput *currentOutput = sourcePicture;
// Search through multiple faces.
for ( ArtechFacialFeature *facialFeature in facialFeatures ) {
// Create the distortion for one face.
for ( ArtechImageDistortionDescription *distortion in distortions ) {
GPUImageFilter *imageFilter = [self createDistortionFilter:distortion
facialFeature:facialFeature imageExtent:targetImage.extent];
[currentOutput addTarget:imageFilter];
currentOutput = imageFilter;
}
}
[currentOutput useNextFrameForImageCapture];
[sourcePicture processImage];
UIImage *currentFilteredVideoFrame = [currentOutput imageFromCurrentFramebuffer];
targetImage = [targetImage initWithCGImage:currentFilteredVideoFrame.CGImage];
[sourcePicture removeAllTargets];
currentFilteredVideoFrame = nil;
sourcePicture = nil;
currentOutput = nil;
CFRelease( inputImage );
}
return targetImage;
}
【问题讨论】:
-
这个答案将帮助您采取内存预防措施 - stackoverflow.com/questions/26921227/…
-
感谢您对 Kampai 的评论!我认为所有内存都被正确释放。我在分析器中找不到泄漏或过多的内存消耗。那是真正困扰我的部分。 :(
-
我猜想消耗更多内存的原因是
nested for结构。尝试以块方式或在后台重新格式化它。我不确定GPUImageFilter内存结构——它也可能使用缓存。 -
for 循环在 1-3 个过滤器之间创建,它们被链接在一起。不应该完全破坏内存。我添加了自动释放池,以便在每个帧处理后释放内存。
-
AFAIK
GPUImageFilter不应被缓存。即使是,它也应该在内存压力下释放?
标签: ios iphone image-processing memory-management gpuimage