如何在libgdx中创建加载屏幕?

时间:2012-08-18 07:10:51

标签: android opengl-es libgdx

我有一个GameScreen课程,可以渲染我的游戏。 但在开始渲染游戏之前,它需要阅读文件并初始化这是非常耗时的。

所以我需要显示/渲染另一个名为Screen的{​​{1}}类,以便花费一些时间并同时读取我的文件并为我的LoadingScreen执行初始化过程,并在初始化完成后通过调用GameScreen更改屏幕。

我需要使用线程来进行这种并发工作,现在问题是如果我使用线程来读取文件并进行初始化;当切换到setScreen(gameScreen)时,openGl会给我这个错误:

GameScreen

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

我发现问题是由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) 引起的。在初始化程序线程中初始化网格并在主线程中呈现会导致此错误。但我不知道如何解决它。

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

我的workouround在我的加载屏幕方法中使用了操作:

@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)让魔术 - 游戏不冻结

答案 2 :(得分:-1)

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