0

私は affoundation ビデオ エンコーディング プログラムのプロファイリングを行っていました。フレームが書き込まれるとメモリが増加します。autoreleasepool を追加した後、問題はなくなりました。

        @autoreleasepool {

            NSString *inputFramePath = self.inputFramePaths[self.currentFrameIndex++];
            self.currentFrame = [UIImage imageWithContentsOfFile:inputFramePath];

            CVPixelBufferRef buffer = (CVPixelBufferRef)[VideoExporter newPixelBufferFromCGImage:self.currentFrame.CGImage size:self.resolution];
            if (buffer) {
                [self.adaptor appendPixelBuffer:buffer withPresentationTime:self.nextPTS];
                CVPixelBufferRelease(buffer);
                self.nextPTS = CMTimeAdd(self.frameDuration, self.nextPTS);
            }
        }

autoreleasepool を使用しない場合:

ここに画像の説明を入力

autoreleasepool を使用する場合:

ここに画像の説明を入力

autoreleasepool についてはまだよくわかりません。私のコードで正確に何が起こったのか説明してもらえますか? また、フレームごとにプールを空にする代わりに、フレーム書き込みをバッチ処理する必要がありますか?

4

1 に答える 1

1

オブジェクトを自動解放すると、自動解放プールに追加されます。通常、追加されるプールは、スタックをバックアップするように作成され、実行ループの一部として (メイン スレッドで作成されたプールの場合)、またはスレッドの終了時 (手動でプールを作成する場合) に排出されます。スレッドの開始)

他の場所に自動解放プールを作成することにより、スコープ内の自動解放されたオブジェクトは、既存のプールが排出されるのを待つのではなく、そのプールが排出されるときに解放されます。大量のデータがループで処理される場合、これによりメモリ使用量の上限を大幅に削減できます。

一連の画像を処理することは、そのような使用例の 1 つになる可能性があります。あなたの場合、あなたのコード サンプルは、一度に複数のフレームを処理するためのループの一部であると推測しています。

自動解放プールの外部で必要なすべてのオブジェクトが保持されている限り、安全に使用できます。

自動解放プールに関するAdvanced Memory Management Programming Guideのセクションを必ずお読みください。

于 2013-07-29T05:38:52.503 に答える