10

GameScreenゲームをレンダリングするクラスがあります。ただし、ゲームのレンダリングを開始する前に、ファイルを読み取って初期化する必要があり、これには時間がかかります。

したがって、時間を費やして同時にファイルを読み取り、 my の初期化プロセスを実行するために、Screen呼び出された別のクラスを表示/レンダリングする必要があります。初期化が完了したら、 を呼び出して画面を変更します。LoadingScreenGameScreensetScreen(gameScreen)

この同時作業を行うにはスレッドを使用する必要があります。問題は、スレッドを使用してファイルを読み取って初期化する場合です。GameScreenopenGlに切り替えると、次のエラーが表示されます。

javax.media.opengl.GLException: Error: no OpenGL buffer object appears to be bound to target 0x8892
at com.sun.opengl.impl.GLBufferSizeTracker.setBufferSize(GLBufferSizeTracker.java:118)

両方のスレッドが同時にグラフィック リソースを使用するわけではないことを認識しています。

Mesh問題の原因はesであることがわかりました。イニシャライザ スレッドでメッシュを初期化し、メイン スレッドでレンダリングすると、このエラーが発生します。しかし、私はそれを解決する方法がわかりません。

この問題を解決するためのアイデアはありますか?

4

3 に答える 3

4

コメントで示唆されているように、AssetManagerは、ほとんどの libGDX リソース (オーディオ、テクスチャなど) を、スプラッシュまたは読み込み画面を表示しながら非同期に読み込む方法です。

その他の操作については、バックグラウンド スレッドで実行する (または他の Android または Java バックグラウンド タスク実行機能のいずれかを使用する) ことで十分です。setScreenlibGDX レンダリング スレッドで実行する必要があるlibGDX ルーチンまたはその他のルーチンを呼び出すには、次Gdx.app.postRunnableのように を使用します。

Gdx.app.postRunnable(new Runnable() {
     @Override
     public void run() {
         // Do something on the main thread
         myGame.setScreen(postSplashGameScreen);
     }
  });

の可視性によっては、別のコンテキストで Runnable を構築しmyGamepostSplashGameScreenそれをバックグラウンド スレッドに渡して完了時に投稿する方が簡単な場合があります。

于 2013-01-29T03:28:07.133 に答える
2

私の回避策は、読み込み画面のメソッドでアクションを使用しています。

@Override
public void show() {
    stage.addAction(Actions.sequence(Actions.delay(0.5f), action_loading_assets_and_other_stuff, Actions.delay(0.5f), action_setScreen));
}

Actions.delay(0.5f) は魔法を作ります - ゲームはフリーズしません

于 2013-09-17T11:25:34.187 に答える