1

カメラから直接captureOutputのビデオフレームを処理するiOSアプリがあります。処理の一環として、別のソース ファイルでいくつかの C 関数を呼び出しています。UIImages を生データに変換し、これらを迅速に渡します。すべての処理は、ビデオ出力に関連付けられたキューで行われます。

これは、ある程度まではうまくいくようです。渡すデータが大きくなりすぎて、C 関数の初期化段階で EXC_BAD_ACCESS エラーがランダムに表示されるようになると、限界に達しているようです。初期化とは、小さな静的配列を宣言し、それらをゼロなどに設定することです。

大量のデータを渡すと何らかのスタック制限に達したのではないかと思ったので、Other Linker Flags と -Wl,-stack_size を使用してスタック サイズを増やしてみましたが、違いはないようでした。

この方法で非 UI スレッドから C 関数を呼び出す場合に注意すべきことは他にありますか?

少し一般的になって申し訳ありませんが、コードの詳細を投稿することはできません。この種の状況に対する一般的なアドバイスとヒントを探しています。

いくつかの追加情報 - Objective-C のビデオ処理側でメモリの解放と自動解放プールの使用に問題がありました (別のスレッドを使用しているため、推奨されています) - おそらく C コードで同じ問題に直面しています。Cでリリース/解放が実行される頻度を上げる方法はありますか、それとも私は自分のしっぽを追いかけているだけですか?

4

2 に答える 2

0

コードのいくつかの重要な領域にいくつかの @autoreleasepool ブロッ​​クを含めた後、発生していたメモリの問題の主な原因を特定しました。

次のブロックを captureOutput コールバック関数のすぐ内側に含めるとうまくいったようです。

@autoreleaspool
  {
  imageColour = [self imageFromSampleBuffer:sampleBuffer];
  }

注:imageFromSampleBufferは、 AVFrameworkを使用して画像をキャプチャするこの質問iosから取得されました

于 2013-08-01T09:17:16.227 に答える
0

したがって、問題の根本はメモリ使用量です。メモリ リークがなく、細心の注意を払っていたとしても、iOS でビデオ処理アプリを作成するのは非常に難しい作業です。これは、OS がメモリ使用のためにアプリを終了する前に、実際にアプリに割り当てることができるメモリが非常に限られているためです。このテーマに関する私のブログ投稿を読みたい場合は、video_and_memory_usage_on_iosで見つけることができます。. 覚えておくと便利なルールとして、基本的には 10 メガバイトのメモリを短時間割り当てて使用できますが、それ以上のメモリを割り当てると、OS が混乱するリスクがあり、アプリが終了する可能性があります。ファイル内の仮想マップ メモリの場合、一度にマップされるすべてのメモリの上限は合計で約 700 MB です。これはスタックの問題ではなく、ヒープ メモリについて話しているのです。ビデオ メモリをスタックに置くべきではありません。メモリへのポインターのみを渡すように注意し、メモリをあるバッファーから別のバッファーにコピーしないでください。バッファー内のメモリに参照を渡すだけです。CoreGraphics および CoreVideo の iOS API は、このタイプの「バッファーを割り当ててポインターを渡す」タイプのアプローチをサポートしています。

于 2013-07-16T21:55:44.497 に答える