私は複数の 'フレーム'で構成されたOpenGL ES 2.0アプリケーション(Windows用のangleprojectを開発用に開発中)を開発中です。EGL/OpenGL ES /スイッチングのコンテキストが遅い
各フレームは、周囲のフレームを妨害しないでください。フレームは、OpenGL ES 2.0を使用して、そのフレーム内で実行されるコードによって描画されます。
私の最初の試みは、各フレームにフレームバッファを割り当てることでした。しかし、OpenGLの内部状態は1つのフレームが描画されている間に変更され、次のフレームが既知のOpenGL状態をすべて包括的にリセットしない場合、副作用が発生する可能性があります。これは、各フレームが分離されてお互いに影響を及ぼさないという私の要求を破ります。
私の次の試みはフレームごとのコンテキストを使用することでした。私はフレームごとに独自のコンテキストを作成しました。私は共有リソースを使用しているので、eglMakeCurrentを各フレームに、それぞれ独自のフレームバッファ/テクスチャにレンダリングし、次にeglMakeCurrentをグローバルに戻して、各テクスチャを最終画面に合成します。
これはインスタンスを隔離するのに素晴らしい仕事ですが、eglMakeCurrentはです。が遅いです。それらのうちのわずか4つが画面をレンダリングするのに1秒以上かかることがあります。
どのようなアプローチが可能ですか?コンテキスト切り替えをスピードアップする方法や、フレームごとにOpenGLの状態をどうにかしてコンテキストを切り替える方法はありますか?
プラットフォームが提供するEGLおよびOpenGL ESライブラリをANGLEをバイパスして直接使用する場合でも、eglMakeCurrentの問題は多くのプラットフォーム上に存在します。基本的な問題は、eglMakeCurrentが返る前にglFlushを内部的に呼び出すことをEGL仕様が効果的に要求するため、eglMakeCurrentはしばしば高価な呼び出しであるということです。 glFlushは多くのCPUを焼くことができます。 EGLContextのスワップは、ドライバの内部GLステートマシンのバリデーションにも影響を与えます。 – Chadversary