2015-10-06 393 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