【问题标题】:CIContext, iOS 9 and memory issuesCIContext、iOS 9 和内存问题
【发布时间】:2015-10-06 23:58:44
【问题描述】:

所以我最近将 iOS 更新到了 9.0.2。 我一直在使用 RosyWriter(Apple 的示例)来使用 CIFilter 和 CIContext 捕获和过滤视频帧。 它在 iOS 7 和 8 中运行良好。 这一切都在 iOS 9 中崩溃了。

现在 RosyWriter 中的内存报告和我的应用程序如下所示:

最终应用程序崩溃。

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

花了大约 4 天后,我发现如果每次我想渲染一个缓冲区并在之后释放它时创建一个新的 CIContext 实例 - 这会降低内存。但这不是解决方案,因为这样做成本太高。

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

谢谢。

【问题讨论】:

  • 您是否运行了分配(工具)以查看泄漏的位置?
  • 仪器中未显示泄漏。
  • 您在哪里以及如何进行测试?使用 Release 配置的测试会产生误导性的结果。模拟器上的测试会给出误导性的结果。
  • iPhone 6 plus 和 iPhone 4s,调试和发布都一样 - 结果相同。
  • 我在 9.1 上,我仍然遇到render(_:toMTLTexture:commandBuffer:bounds:colorSpace:) 的严重泄漏...

标签: ios iphone memory avfoundation ios9


【解决方案1】:

我可以确认 iOS 9.2 上仍然存在这种内存泄漏。 (我也发过Apple Developer Forum。)

我在 iOS 9.2 上遇到了同样的内存泄漏。我已经使用 MetalKit 和 MLKDevice 测试了删除 EAGLContext。我已经使用不同的 CIContext 方法进行了测试,例如 drawImage、createCGImage 和渲染,但似乎没有任何效果。

很明显,这是 iOS 9 的一个错误。通过从 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.m:118

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

最后用这个替换 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);  

【讨论】:

  • 他们说这不是泄漏,而是一种奇怪的 Xcode 行为。我不确定这一点,因为即使不在调试模式下,应用程序也会崩溃。 GPUImage 社区,他们在这里讨论:github.com/BradLarson/GPUImage/issues/2093
  • Henrik 你在这方面有什么进展吗?我还在 github 上的 SCRecorder 存储库中看到了您的 cmets。我遇到了同样的问题,似乎无法弄清楚。
  • 否 @user3344977 我通过创建自定义视频合成器解决了我的问题。正如 krafter 指出的那样,我不确定这是否是 Xcode 错误,但当我对其进行测试时,它实际上似乎是这样。
【解决方案2】:

在使用上下文后使用下面的代码

context = [CIContext contextWithOptions:nil];

同时释放 CGImageRef 对象

 CGImageRelease(<CGImageRef IMAGE OBJECT>);

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案3】:

卡夫特,

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

看起来如果 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 中的一个错误,因为输出图像的大小应该始终与 dod 的大小匹配。

我的设置:iOS v9.2、iPhone 5C 和 iPad 2、Xcode 7.2、Obj-C

【讨论】:

  • 什么是dod?不,没有自定义过滤器
猜你喜欢
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2017-02-04
  • 2015-12-19
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多