私はLibGDXを使ってゲームを作っています。私は必要に応じて即座に資産をロード/アンロードしたいと思っています。ただし、主スレッドでアセットが読み込まれるのを待つと、ラグが発生します。この問題を解決するために、ロードする必要があるアセット(テクスチャ、サウンドなど)を監視し、それらを適切にロード/アンロードするバックグラウンドスレッドを作成しました()。現在のスレッドでOpenGLコンテキストが見つかりません
残念ながら、そのスレッドからAssetManager.update()
を呼び出すと、次のエラーが発生します。
com.badlogic.gdx.utils.GdxRuntimeException: java.lang.RuntimeException: No OpenGL context found in the current thread.
私は初めにメインスレッドでバックグラウンドスレッドをすると、最初の数画面だけを扱うrun
試してみた、とすべてが正常に動作します。私はアルゴリズムを変更して、同じスレッドの最初からすべてをメモリにロードするだけで、それも同様に機能します。しかし、いずれもバックグラウンドスレッドでは機能しません。
私は(奇妙な方法で柔軟性のある)のOpenGL ES 2.0ではなく、Windows上でAndroid上でこれを実行すると、すべてが正常に動作し、私も画像のピクセル寸法を得ることができます - が、テクスチャは黒をレンダリング。
これは、OpenGLコンテキストが単一のスレッドにバインドされているが、あまり多くはないことが判明しました。これは、私がメインスレッドで押したときにすべてが機能する理由を説明し、別のスレッドに入れたときではありません。このコンテキストの問題を解決するにはどうすればよいですか?
-1複数のスレッドからOpenGLコンテキストを誤って記述できませんでした。あるスレッドからOpenGLコンテキストを切り離して別のスレッドに接続することは、完全に可能です。 – datenwolf
マルチスレッドの意味で別のスレッドにコンテキストを切り離して接続する方法は?コンテキスト自体は、ロックを試行してそれを達成したい場合を除き、一度に1つのスレッドだけがアクセスできます。しかし、それは全体のポイントを破る。 – Jyro117
あなたは、OpenGLコンテキストがレンダリングスレッドからのみ使用できると主張しました。これは、コンテキストを作成したスレッドだけがそれを使用できることを意味しています。 BTW:共有オブジェクトネームスペースを使用して同じdrawable上にいくつかのOpenGLコンテキストを作成し、それぞれを独自のスレッドにアタッチすることができます。これにより、マルチスレッド化が可能になります。 – datenwolf