私はこの動作をiOS 9でしか観察していません。 iOS 8は正常に動作します。なぜCIContext.createCGImageはメモリリークの原因ですか?
これはSDKのバグである可能性があります。私はAppleにレーダーを公開していますが(22644754)、とても奇妙なことに気づき、漏れを避ける。
私が観察したことは、CIContext.createCGImageが呼び出されるたびにメモリ使用量が増加することです。難しい部分は、メモリの増加がアプリの外で発生するということです。
「メモリレポート」をXcodeから見ると、「その他のプロセス」セクションにメモリが表示されます。
まず、私はEAGLContextに裏打ちされたCIContextを作成します:
基本的に、私は問題は以下の通りです引き起こすことが何をすべきか(私は厳密に必要な部品がリークを再現するためのコードを簡素化している)
let glContext = EAGLContext(API: .OpenGLES2)!
let ciContext = CIContext(EAGLContext: glContext, options: [kCIContextOutputColorSpace : NSNull()])
はその後、私は以下を使用して画像を描画:
let input = CIImage(image: UIImage(named: "DummyImage")!)!
ciContext.createCGImage(input, fromRect: input.extent)
DummyImageはちょうどサンプル画像ファイルです。リークはこの画像のサイズに直接関連しているので、問題をより顕著にするために大きな画像を使用するのが最善です。
私はCIFilterを使用していないので(同じ結果をもたらす)、結果の画像をキャプチャしていません(キャプチャしてもCGImageReleaseをオブジェクトとして使用できませんでした自動的に管理されます)。
レンダリングコードが十分に実行された場合、メモリが非常に大きくなり、実行中のアプリケーションが強制終了されます。
興味深いことに、CIContextを破壊しても差は出ませんが、EAGLContextを破棄すると撮影されたメモリが返されます。これは、OpenGL側でリークが起こっていると私に思い出させます。
リークを引き起こす可能性のあるコードに何かがないのですか? EAGLContextのメモリを解放するために私ができる呼び出しはありますか? (費用のかかる操作であるため、常に再作成することは選択肢ではありません)。
問題を再現するための簡単なプロジェクトを作成しました。
- オープンし、デバイス上の添付プロジェクトを実行します。再現する
https://www.dropbox.com/s/zm19u8rmujv6jet/EAGLContextLeakDemo.zip?dl=0
手順は次のとおりです。あなたはでそれを見つけることができます。
- Xcodeの「メモリレポート」画面に従います。成長は「利用状況比較」の円グラフの「その他のプロセス」の部分に表示されます。
- アプリには3つのボタンがあります。それぞれはcreateCGImageコマンドを特定の回数実行します(ボタンラベルに表示されています)。
- いずれかのボタンをタップすると、「その他のプロセス」のメモリ使用量が増加します。これは、いくつかのcreateCGImage呼び出しを実行した後でより顕著になるかもしれません。
- 100レンダリングボタンをタップすると効果がより明確に表示されます。
- メモリが過剰になると、アプリケーションがクラッシュします。
なぜ 'bytesPerPixel = 8'ですか? 'kCIFormatRGBA8'はピクセル形式で4バイトではありませんか? –