iOS6では、OpenGLを使用してAVFoundationビデオフレームでレンダリングを行っています。CVPixelBufferLockBaseAddressとCVPixelBufferUnlockBaseAddressを使用するサンプルコードをたくさん見てきましたが、正確にいつロックとロック解除を実行するのか、なぜそれを実行するのかはわかりません。CPUがメモリを変更しているときにアドレスをロックする必要がありますか?または、GPUが読み取っているときにロックする必要がありますか?いつロックを解除する必要がありますか?なぜ私はロックを解除したいのですか?このStackOverflowの回答を見たことがありますが、私の質問に完全には回答していません。
2 に答える
使用する必要があるたびにロックし、使い終わってもう必要なくなったらロックを解除する必要があります。これにより、バッファが上書きされて、一貫性のない状態のままになるのを防ぐことができます。
ファームウェアの専門家が私にこれを説明したことがあります。一般に、ビデオ出力を処理するときは、ポインタを使用した間接的な参照が多数あることに注意する必要があります。どこか別のフレーム」。
アプリケーションに基づいて、バッファがいつ不要になるかはわかりませんが、それは理解できるはずです。バッファデータを別の場所(新しいオブジェクトの作成など)にコピーした場合は、ロックを解除できることを意味します。
お役に立てれば。
この関数は、CPUのピクセルバッファにアクセスする場合にのみ呼び出す必要があります。GPUがアクセスしない場合は、Appleのドキュメントで非常に明確になっています。
これが公式のアップルドキュメントからの情報です:
CPUでピクセルデータにアクセスする前にCVPixelBufferLockBaseAddress関数を呼び出し、後でCVPixelBufferUnlockBaseAddress関数を呼び出す必要があります。バッファーをロックするときにlockFlagsパラメーターにkCVPixelBufferLock_ReadOnly値を含める場合は、バッファーのロックを解除するときにもこの値を含める必要があります。
重要
GPUを使用してピクセルデータにアクセスする場合、ロックは不要であり、パフォーマンスを低下させる可能性があります。