最小限のリソースを使用して 60 fps でビデオをキャプチャしたいと考えています。これは、フレームごとに最大で 16 ~ 20 ミリ秒を使用する必要があり、ほとんどの時間がフレームでの大量の計算に占有されるためです。
現在、プリセットを使用してAVCaptureSessionPreset1280x720
いますが、640x480 で計算を行いたいと考えています。そうしないと、デバイスが追いつきません。ここから問題が始まります。Apple が開発者に許可していることに従って、640x480@60fps で直接キャプチャすることはできず、現在のサイズ変更は非常に遅いです。
私は Metal カーネル シェーダーで画像のサイズ変更を使用していますが、98% の時間 (Instruments で確認) が次の 2 行に費やされています。
[_inputTexture replaceRegion:region mipmapLevel:0 withBytes:inputImage.data bytesPerRow:inputImage.channels() * inputImage.cols];
...
[_outputTexture getBytes:outputImage.data bytesPerRow:inputImage.channels() * outputImage.cols fromRegion:outputRegion mipmapLevel:0];
基本的にメモリロード/ストア命令で。理論的にはiPhoneのCPUとGPUの間でメモリが共有されているため、この部分は私を困惑させます。
メタルコードはもっと速くあるべきだと思いますか? また、Metal を使用したビデオ プレゼンテーションも行っていますが、問題はありません (GPU で最大 1 ミリ秒、サイズ変更には最大 20 ミリ秒かかります)。
画像のサイズを変更するより高速な方法はありませんか? Image I/O の経験はどうですか?
アップデート:
ワークグループのサイズを 22x22x1 に増やしたところ、画像のサイズ変更のパフォーマンスが GPU の 20 ミリ秒から 8 ミリ秒に向上しました。まだ私が望むものではありませんが、より良いです。
更新 2:
CoreGraphics に切り替えましたが、十分に高速です。この投稿を参照してください。