2015-10-06 34 views
3

所以我最近更新iOS到9.0.2。 我一直在使用RosyWriter,苹果的例子来捕捉和使用CIFilter和CIContext过滤视频帧。 它在iOS的7伟大的工作和8 这一切都打破了在IOS中RosyWriter 9CIContext,iOS 9和内存问题

现在内存报告和我的应用程序是这样的: enter image description here

而最终的应用程序崩溃。

我打电话给[_ciContext render:toCVPixelBuffer:bounds:colorSpace:];imageWithCVPixelBuffer。当我调用这两种方法时,看起来像CIContext有内部内存泄漏。

花了大约4天后,我发现如果我每次创建一个新的CIContext实例时,我想渲染一个缓冲区并将其释放后 - 这将保持内存不变。但这不是一个解决方案,因为这样做太昂贵了。

其他人有这个问题吗?有没有解决的办法?

谢谢。

+0

你运行了一个分配ns(仪器)查看泄漏的位置? – Aggressor

+0

仪器中未显示泄漏。 – krafter

+0

您如何以及在哪里测试?使用发布配置进行测试会导致误导性结果。模拟器上的测试会导致误导结果。 – matt

回答

-1

Krafter,

您是否正在编写自定义过滤器?我发现iOS中的dod工作方式不同。

看起来好像dod.extent.origin.x和dod.extent.origin.y不接近以双精度存储的整数(例如31.0,333.0) ,那么输出图像的extent.size将是(dod.extent.size.width + 1.0,dod.extent.size.height + 1.0)。在iOS 9.0之前,输出图像的extent.size总是(dod.extent.size)。因此,如果(您通过自定义CIFilter反复循环显示相同的图像,您的dod.extent并不接近漂亮,甚至整数){您会在每次运行过滤器时获得尺寸增加1.0的图像,这可能会产生一个像你一样的内存配置文件。}

我假设这是iOS 9中的一个bug,因为输出图像的大小应该总是与dod的大小相匹配。

我的设置:iOS版V9.2,iPhone 5C和iPad 2时,Xcode 7.2,OBJ-C

+0

dod是什么?不,没有自定义过滤器 – krafter

1

我可以证实,此内存泄漏仍然存在,在iOS 9.2。 (我也发布在Apple Developer Forum上。)

我在iOS 9.2上得到了相同的内存泄漏。我测试了使用MetalKit和MLKDevice来删除EAGLContext。我已经测试过使用CIContext的不同方法,如drawImage,createCGImage和render,但似乎没有任何工作。

很明显,这是iOS 9以来的一个bug。通过从Apple下载示例应用程序(请参见下文)尝试一下自己,然后在iOS 8.4的设备上运行相同的项目,然后在iOS 9.2的设备,并注意Xcode中的内存量表。

下载 https://developer.apple.com/library/ios/samplecode/AVBasicVideoOutput/Introduction/Intro.html#//apple_ref/doc/uid/DTS40013109

一下添加到APLEAGLView.h:20

@property (strong, nonatomic) CIContext* ciContext; 

更换APLEAGLView。米:118与此

[EAGLContext setCurrentContext:_context]; 
_ciContext = [CIContext contextWithEAGLContext:_context]; 

而且finaly替换APLEAGLView.m:341-343与此

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

    @autoreleasepool 
    { 
     CIImage* sourceImage = [CIImage imageWithCVPixelBuffer:pixelBuffer]; 
     CIFilter* filter = [CIFilter filterWithName:@"CIGaussianBlur" keysAndValues:kCIInputImageKey, sourceImage, nil]; 
     CIImage* filteredImage = filter.outputImage; 

     [_ciContext render:filteredImage toCVPixelBuffer:pixelBuffer]; 
    } 

    glBindRenderbuffer(GL_RENDERBUFFER, _colorBufferHandle); 
+0

他们说这不是泄漏,而是一个奇怪的Xcode行为。我对此并不确定,因为即使不在调试模式下,应用也会崩溃。 GPUImage社区,他们在这里讨论它:https://github.com/BradLarson/GPUImage/issues/2093 – krafter

+0

亨利克你有什么进展呢?我还在github上看到了你对SCRecorder回购的评论。我遇到了同样的问题,似乎无法弄清楚。 – user3344977

+0

否@ user3344977我通过创建自定义视频合成器解决了我的问题。我不确定这是否是一个Xcode错误,正如krafter指出的那样,但是当我测试它时,它实际上似乎是如此。 –

0

只要使用以下代码后使用上下文

context = [CIContext contextWithOptions:nil]; 

和释放CGImageRef对象也

CGImageRelease(<CGImageRef IMAGE OBJECT>); 
+2

虽然此代码片段可能会解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 – SmokeDispenser