10

我有一个GameScreen渲染我的游戏的类。但是在开始渲染游戏之前,它需要读取文件并进行初始化,这非常耗时。

所以我需要显示/渲染另一个Screen名为LoadingScreen的类,以便花费一些时间并同时读取我的文件并为我做初始化过程GameScreen,并在初始化完成后通过调用改变屏幕setScreen(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)

我知道不是两个线程同时使用图形资源。

我发现问题是由Meshes 引起的。在初始化线程中初始化网格并在主线程中渲染会导致此错误。但我不知道如何解决它。

你有什么想法来解决这个问题吗?

4

3 回答 3

4

正如评论中所建议的,AssetManager是在显示启动画面或加载屏幕时异步加载大多数 libGDX 资源(音频、纹理等)的方式。

对于其他操作,在后台线程中运行它们(或使用其他 Android 或 Java 后台任务执行工具之一)就足够了。要调用setScreen需要在 libGDX 渲染线程上执行的 libGDX 例程或其他例程,请使用Gdx.app.postRunnable,如下所示:

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

根据 的可见性,myGamepostSplashGameScreen不同的上下文中构造 Runnable 可能更容易,然后将其传递给后台线程以在完成后发布。

于 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 回答
-1

动作延迟也为我做了。我只是在加载屏幕 show() 方法中对 0.2f 的延迟动作和舞台上的可运行动作进行排序。现在加载屏幕渲染方法被调用了几次,而绘制屏幕的 0.2 秒延迟,我可以在可运行的操作中进行操作。

于 2014-06-03T14:21:10.647 回答