首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CIContext、iOS 9和内存问题

CIContext、iOS 9和内存问题
EN

Stack Overflow用户
提问于 2015-10-06 23:58:44
回答 3查看 1.5K关注 0票数 3

因此,我最近将iOS更新为9.0.2。我一直在使用RosyWriter,苹果的例子,用CIFilter和CIContext捕捉和过滤视频帧。它在iOS 7和8中非常有效,在iOS 9中都出现了故障。

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

最终,应用程序崩溃了。

我将_ciContext呈现: toCVPixelBuffer:界: colorSpace:;和_ciContext当我调用这两种方法时,CIContext似乎有内部内存泄漏。

在花了大约4天之后,我发现如果我每次创建一个新的CIContext实例,我希望呈现一个缓冲区并在之后释放它--这会使内存减少。但这不是一个解决方案,因为这样做太昂贵了。

还有人有这个问题吗?有办法绕道吗?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2015-12-26 11:02:19

我可以确认这个内存泄漏仍然存在于iOS 9.2上。(我也在苹果开发者论坛上发布过。)

我在iOS 9.2上也有相同的内存泄漏。我已经测试过通过使用EAGLContext和MLKDevice删除MetalKit。我已经使用了不同的CIContext方法进行了测试,比如drawImage、createCGImage和render,但是似乎没有什么效果。

很明显,从iOS 9开始,这是一个bug。从苹果下载示例应用程序(见下文),然后在带有iOS 8.4的设备上运行相同的项目,然后在iOS 9.2的设备上运行相同的项目,并注意Xcode中的内存规。

下载参考文件/doc/uid/doc 40013109

将其添加到APLEAGLView.h:20中

代码语言:javascript
复制
 @property (strong, nonatomic) CIContext* ciContext;

将APLEAGLView.m:118替换为

代码语言:javascript
复制
[EAGLContext setCurrentContext:_context];
 _ciContext = [CIContext contextWithEAGLContext:_context];

最后将APLEAGLView.m:341-343替换为

代码语言:javascript
复制
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);  
票数 1
EN

Stack Overflow用户

发布于 2016-03-04 07:35:04

只需在使用上下文之后使用下面的代码

代码语言:javascript
复制
context = [CIContext contextWithOptions:nil];

以及发布CGImageRef对象

代码语言:javascript
复制
 CGImageRelease(<CGImageRef IMAGE OBJECT>);
票数 0
EN

Stack Overflow用户

发布于 2015-12-15 06:03:14

克拉夫特

你在写自定义过滤器吗?我发现在iOS 9中,dod的工作方式不同。

看起来,如果dod.extent.initi.x和dod.extent.initi.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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32981663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档