私の問題:
画面にopengles 2.0でレンダリングする必要があるビデオ(25FPSとしましょう)があります。ビデオを読み取るために、そのビデオを opengl es テクスチャにデコードするデコーダを使用します。レンダーパスを使用して、このテクスチャを画面に描画します。
私がしなければならないことは、デコーダーから画像を取得して GPU にアップロードし、shaderprogram を呼び出して画面に画像をレンダリングすることです。ビデオが 25 FPS の場合、画面を 40 ミリ秒単位 (1000 ミリ秒/25 FPS) で更新する必要があります。
各ステップで、次のことを行う必要があります。
- デコーダーから画像を取得する
- GPUメモリにプッシュします
- 画面をレンダリングする
- スワップバッファ
これまでのところ、それは機能しています。ここで、デコーダがフレームをデコードするのに 40 ミリ秒以上かかることがあります。それは常に起こるわけではありませんが、時々起こります。
解決策は、キャッシュを構築することです。つまり、最初の画像を表示する前に、つまり 5 つの画像をレンダリングします。これには問題が伴います。非同期に発生する必要があるため、キャッシュの構築と画面のレンダリングを同時に行うことができます。それが起こった場合、それはもはや「流動的」ではないため、ビデオでそれを見ることができます.
私の質問:
- その解決策はありますか?
- レンダーサーフェスのバックバッファーにコピー (?!) できる ?-buffer を作成して、その種類のバッファーでキャッシュを作成し、他のスレッドをブロックすることなくバックバッファーにコピーすることは可能ですか?このバッファを作成していますか?
また
- バックバッファを別のバッファで埋める方法は?
私はすでに試しました:
- フレームバッファ (テクスチャ) をキャッシュとしてレンダリングします。テクスチャもレンダリングする必要があることを除けば、これはほぼ完璧に機能します。これは、(非同期であるため) キャッシュフレームが構築され、画面の画像が構築される場合、rendermethods をミューテックス (/同期化) する必要があることを意味します。そうしないと、プログラムがクラッシュします。しかし、同期には、非同期で行うという要点が必要です。したがって、これは良い解決策ではありません。