実際の質問
いくつかの答えが私の問題を解決します:
CGImageのように、ダイレクト データ プロバイダ ( で作成CGDataProviderCreateDirect)からデータを強制的にリロードすることはできCGContextDrawImageますか? または、それを行うために self.layer.contents に設定できる他の方法はありますか?CGContext1024x768 の画像を少なくとも 30 fps で一貫してレンダリングするために使用できる構成またはトリックはありますかCGContextDrawImage。CVOpenGLESTextureCacheCreateTextureFromImage独自のテクスチャ データを使用して、リアルタイム バッファの更新に成功した人はいますか?CVImageBufferApples のテクスチャに関するドキュメントから他のプロパティをコピーしたので、私の最大の問題は を作成することだと思います。誰かがこれについてさらに情報を持っているなら、それは素晴らしいでしょう.- 30 fps でメモリから画面に画像を取得する方法に関するその他のガイドライン。
背景(ロット):
NPOT 画像データのピクセルをリアルタイム (最小 30 fps) で変更し、iOS の画面に描画する必要があるプロジェクトに取り組んでいます。
私が最初に考えたのは、更新に OpenGL を使用glTexSubimage2Dすることでしたが、残念ながら、ドライバーがフレームごとに回転して RGB データを BGR に変換するため、非常に遅くなりました (iPad では 6 fps)。glTexSubImage2Dだからあなたが言うBGRでそれを送ってください、そして私もそうしますが、何らかの理由でGL_BGRgo figureで呼び出すことができません. 画像データが 2 の累乗ではないため、速度が遅くなることはわかっていますが、私の要件ではそれが求められます。
より多くの読書が私に導きましたCVOpenGLESTextureCacheCreateTextureFromImageが、すべての例は、直接カメラ入力を使用して取得するものCVImageBufferRefです。ドキュメント(公式ではなくヘッダーコメントのみ)を使用して、画像データから独自の CVImageBuffer を作成しようとしましたが、これでは機能しません(いいえこれは、Apple がリアルタイム カメラ データを処理するために特別に構築したものであり、IDK 以外ではあまりテストされていないと思われます。
とにかく、OpenGL をダンプして私の考えをCoreGraphicsに切り替えることで私の尊厳をあきらめた後、iPhone
で画面バッファーを描画する最速の方法であるこの質問に導かれました。 CGImage にはそれが必要ですよね。まあ、宣伝されているようにはうまくいかないようです。私が使用すると、すべてが機能します。ピクセル バッファーを変更できます。描画のたびに、必要に応じてデータ プロバイダーから画像データを要求し、(CGImageCGDataProviderCreateDirectCGContextDrawImageCGDataProviderDirectCallbacksNote:以前のものと同じアドレスを持つ場合、更新されたポインターを無視する最適化が組み込まれているようです)。CGContextDrawImage は、補間を無効にして 6 fps から引き上げても、超高速 (約 18 fps) ではありません。Apple のドキュメントによると、 を使用self.layer.contentsすると よりもはるかに高速になりCGContextDrawImageます。を使用self.layer.contentsすると、最初の割り当てで機能しますが、 を呼び出した場合でも、CGImageのようにデータ プロバイダーからのリロードを要求することはありません。私が言及した SO の質問では、フレームごとにデータ ソースから新しい CGImage を作成および破棄することで、ユーザーが問題の解決策を示しています。CGContextDrawImage[layer setNeedsDisplay]
注:これらすべての操作をプロファイルしましたが、問題は実際にはglTexSubImageOpenGLの問題CGContextDrawImageであり、実際にはCoreGraphicsの問題であるため、「go profile」の回答はありません。
EDITこの手法を示すソース コードは、 http: //github.com/narpas/image-sequence-streamingにあります。