OpenGL ESを使用してAndroid用の小さなゲームエンジンを試してみました。私はゲームオブジェクトを更新するGame Threadを作成し、GLThreadはシーンを描画します。私はGLSurfaceViewのonSurfaceCreatedメソッドでテクスチャをロードする必要があることを読んでいました。私はそれに従っていますが、GLThreadの代わりに私のゲームスレッドからテクスチャをロードしようとしていたデバッグの目的のために。エラーはなく、画面上にテクスチャが表示されませんでした。私は一日をかけて問題を見つけようとしましたが、最後に私は以下を読んでいますhereOpenGL ES関数を別のスレッドから呼び出せない理由
"メインスレッドでOpenGLを使用するようにしてください。"非常に重要です。あなたのゲームエンジン(別のスレッドにある可能性があります)に、glスレッドと同期していないテクスチャロード関数を呼び出すことはできません。 gl-threadに新しいテクスチャをロードするように通知するフラグを設定します(たとえば、新しいテクスチャがロードされる必要があるかどうかをチェックするOnDrawFrame(GL gl)に関数を配置できます)。
コードを変更しますGLスレッドからテクスチャがロードされるようになった理由は分かりませんでした。なぜOpenGL関数が別のスレッドから機能しないのですか?
スレッドを作成する方法は分かっていますが、わかりません上記の抜粋では、「あなたのゲームエンジン(別のスレッドにある可能性があります)にglスレッドと同期していないテクスチャ読み込み機能を呼び出すことはできません」と述べています。 GLスレッドと同期している別のスレッドを作成することは可能ですか? GL関数を呼び出すことができますか?これらの概念を理解するためにスレッディングで何を学ぶべきですか?
私はAndroidの人ではありませんが、iOSには同様の警告の理由が2つあります:1つは現在のGLコンテキストがスレッド固有であるため、スレッド間でコンテキスト通貨を転送する必要がある重要なのは)同期せずに複数のスレッドからGL状態を混乱させるだけで、GLコンテキストの状態が壊れることになります。 HTH。 –
私はそれがちょうど同時アクセスを避けることだと思います –