我有一个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)
引起的。在初始化程序线程中初始化网格并在主线程中呈现会导致此错误。但我不知道如何解决它。
你有什么想法来解决这个问题吗?
答案 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);
}
});
根据myGame
和postSplashGameScreen
的可见性,可能更容易在不同的上下文中构造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秒延迟绘制屏幕,我可以在可运行的动作中继续进行操作。