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

Android 如何在libgdx中创建加载屏幕?,android,opengl-es,libgdx,Android,Opengl Es,Libgdx,我有一个GameScreen类来渲染我的游戏。 但是在开始渲染游戏之前,它需要读取文件并初始化,这非常耗时 因此,我需要显示/呈现另一个名为LoadingScreen的Screen类,以便花费一些时间同时读取我的文件,并为我的GameScreen执行初始化过程,初始化完成后,通过调用setScreen(GameScreen)更改屏幕 我需要使用线程来实现这个并发工作,现在的问题是,如果我使用线程来读取文件和初始化;当切换到GameScreen时,openGl会出现以下错误: javax.medi

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

因此,我需要显示/呈现另一个名为
LoadingScreen
Screen
类,以便花费一些时间同时读取我的文件,并为我的
GameScreen
执行初始化过程,初始化完成后,通过调用
setScreen(GameScreen)
更改屏幕

我需要使用线程来实现这个并发工作,现在的问题是,如果我使用线程来读取文件和初始化;当切换到
GameScreen
时,openGl会出现以下错误:

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引起的。初始化初始化器线程中的网格并在主线程中渲染会导致此错误。但我不知道怎么解决它


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

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

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

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

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

我的WorkUround正在使用我的加载屏幕方法中的操作:

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

动作延迟(0.5f)使魔法游戏不会冻结

动作延迟也为我做到了这一点。我只是在loading screens show()方法中,在舞台上用0.2f对一个delayaction和一个runnable操作进行排序。现在调用loading screens render方法几次,而0.2秒的延迟会绘制屏幕,我可以在runnable操作中继续操作。

AssetManager呢?感谢“AssetManager”。它解决了部分问题,但不是全部。使用线程进行初始化仍然是一个问题。使用AssetManager时,必须调用manager.update(),直到它在渲染()中完成。为什么您不能在那里对每次渲染调用执行部分初始化操作?@Matsemann:I每次渲染调用调用调用manager.update()。问题是在完成update()调用之后,我在读取资产之后还有一些其他初始化;e、 g:初始化物理引擎。这些工作也需要一些时间来完成。这对我不起作用。如果我使用这种方法,新屏幕会变黑。有什么想法吗?