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

Ali*_*aaa 10 android opengl-es libgdx

我有一个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)
Run Code Online (Sandbox Code Playgroud)

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

我发现问题导致Meshes.在初始化程序线程中初始化网格并在主线程中呈现会导致此错误.但我不知道如何解决它.

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

P.T*_*.T. 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);
     }
  });
Run Code Online (Sandbox Code Playgroud)

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