2011-10-24 10 views
10

OpenGL ESを使用してAndroid用の小さなゲームエンジンを試してみました。私はゲームオブジェクトを更新するGame Threadを作成し、GLThreadはシーンを描画します。私はGLSurfaceViewのonSurfaceCreatedメソッドでテクスチャをロードする必要があることを読んでいました。私はそれに従っていますが、GLThreadの代わりに私のゲームスレッドからテクスチャをロードしようとしていたデバッグの目的のために。エラーはなく、画面上にテクスチャが表示されませんでした。私は一日をかけて問題を見つけようとしましたが、最後に私は以下を読んでいますhereOpenGL ES関数を別のスレッドから呼び出せない理由

"メインスレッドでOpenGLを使用するようにしてください。"非常に重要です。あなたのゲームエンジン(別のスレッドにある可能性があります)に、glスレッドと同期していないテクスチャロード関数を呼び出すことはできません。 gl-threadに新しいテクスチャをロードするように通知するフラグを設定します(たとえば、新しいテクスチャがロードされる必要があるかどうかをチェックするOnDrawFrame(GL gl)に関数を配置できます)。

コードを変更しますGLスレッドからテクスチャがロードされるようになった理由は分かりませんでした。なぜOpenGL関数が別のスレッドから機能しないのですか?

スレッドを作成する方法は分かっていますが、わかりません上記の抜粋では、「あなたのゲームエンジン(別のスレッドにある可能性があります)にglスレッドと同期していないテクスチャ読み込み機能を呼び出すことはできません」と述べています。 GLスレッドと同期している別のスレッドを作成することは可能ですか? GL関数を呼び出すことができますか?これらの概念を理解するためにスレッディングで何を学ぶべきですか?

+5

私はAndroidの人ではありませんが、iOSには同様の警告の理由が2つあります:1つは現在のGLコンテキストがスレッド固有であるため、スレッド間でコンテキスト通貨を転送する必要がある重要なのは)同期せずに複数のスレッドからGL状態を混乱させるだけで、GLコンテキストの状態が壊れることになります。 HTH。 –

+0

私はそれがちょうど同時アクセスを避けることだと思います –

答えて

8

quixotoさんのコメントは最も近いと思います。ほとんどすべてのプラットフォームでOpenGLコンテキストがスレッド固有であるという伝統的な理由は、OpenGLは状態に大きく依存しており、一連の変更をアトミックにするためのセマンティクスがないということです。したがって、たとえば、1つのスレッドで描画操作は次のようになります。

glVertexPointer(... supply vertex positions ...) 
glTexCoordPointer(... provide texture positions ...) 
/* and supply a few other pointers, maybe bind a texture */ 

glDrawArrays(... draw some geometry ...) 

ので、最終的な呼び出しは、前の呼び出しのコンテキストで予測可能な結果を​​提供します。たとえば、glVertexPointerの後にホッピングして、そのジオメトリを描画するために同じシーケンスを実行し、次にこのコードが進行すると、間違ったジオメトリが描画されます。置き換えられた配列のいくつかがオリジナルよりも小さい場合には、メモリアクセスが制限されます。

Androidは、OpenGL共有グループの共通の概念をサポートしています(暗黙のうちに、新しいコンテキストを共通グループに追加する場合は、第3引数でeglCreateContextになります)。 2つのコンテキストが共有グループ内にある場合、それらの各コンテキストは独立した状態を持ち、1つのスレッドからの呼び出しは安全ですが、テクスチャや頂点バッファオブジェクトなどの名前付きオブジェクトはそれぞれに使用できます。したがって、共有グループを使用すると、OpenGLアクションを複数のスレッドで同時に実行できるので、結果を単一のスレッドで組み合わせることができます。

コンテキストを単一のスレッドに結びつけることはそれほど問題ではありません。 OpenGLのコンテキストがOS固有の方法で作成、管理、処分される理由の一部は、一部のOSが他の人とは根本的に異なる方法でこのようなことを処理する必要があるためです独自のソリューションを公開してより良いソリューションを提供することができます。

関連する問題