java.lang.RuntimeException:在线程中生成world时,在当前线程中找不到OpenGL上下文
我正在用LibGDX制作一个2D沙盒游戏(比如terraria)。不过我遇到了一个问题。我需要在另一个线程中生成世界,以便程序可以在生成时渲染动画加载屏幕。我将生成代码放在一个新线程中。运行时,我收到以下错误:java.lang.RuntimeException:在线程中生成world时,在当前线程中找不到OpenGL上下文,java,multithreading,opengl,libgdx,lwjgl,Java,Multithreading,Opengl,Libgdx,Lwjgl,我正在用LibGDX制作一个2D沙盒游戏(比如terraria)。不过我遇到了一个问题。我需要在另一个线程中生成世界,以便程序可以在生成时渲染动画加载屏幕。我将生成代码放在一个新线程中。运行时,我收到以下错误: Exception in thread "Thread-1" java.lang.RuntimeException: No OpenGL context found in the current thread. 为什么会发生这种情况?我如何修复它?当生成器运行时,它需要创建一个需要Op
Exception in thread "Thread-1" java.lang.RuntimeException: No OpenGL context found in the current thread.
为什么会发生这种情况?我如何修复它?当生成器运行时,它需要创建一个需要OpenGL的Sprite,但它似乎不喜欢在单独的线程中运行。有什么见解吗?也许可以在新线程中以某种方式创建GL上下文(但我不确定,因为我从来没有这样做过),但是你为什么要用这种方式实现这一点呢?:)强> 不需要创建新线程来加载资源/生成世界,只需渲染一些“加载”标签/动画-任何您想要的,并在完成后开始渲染世界 如果您试图加载一些资产,您应该使用它的方法来检查是否加载了资产,比如
AssetManager assetManager = new AssetManager();
//load assets
...
//render method
if(assetManager.update())
{
//render world or even change screen to game screen
}
else
//render "loading"
WorldGenerator worldGenerator;
//generate world
...
//render method
if(WorldGenerator.isGenerated())
{
//render world or even change screen to game screen
}
else
//render "loading"
//make a step of generation
如果您正试图生成一个世界,只需将此操作切成若干块(如生成正方形nxn),并有一个方法来执行此操作,只需添加一些控件以检查操作是否完成-它可以是一些枚举、标志、方法。。。假设你有一个类WorldGenerator
AssetManager assetManager = new AssetManager();
//load assets
...
//render method
if(assetManager.update())
{
//render world or even change screen to game screen
}
else
//render "loading"
WorldGenerator worldGenerator;
//generate world
...
//render method
if(WorldGenerator.isGenerated())
{
//render world or even change screen to game screen
}
else
//render "loading"
//make a step of generation
避免像火一样使用多线程——特别是在Libgdx中,需要使用多线程的情况并不多,而且几乎每次都是由框架很好地处理的
Libgdx有一个sweet util,可以将新线程中的代码发布到主GL线程中。以下是一个例子:
new Thread(new Runnable(){
@Override
public void run(){
//Here we are telling libgdx to connect a new runnable to the gl thread
Gdx.app.postRunnable(new Runnable(){
//Type thread code here. Will be seperate to main thread but part of it at the same time
}
}
});
希望这能有所帮助:D我研究了它,显然它不是libGDX的一个选项,正如这里所说的:答案很好,谢谢:DAlso,至于我为什么要这么做。生成代码冻结了所有内容,阻止我的“生成世界…”加载屏幕设置状态栏的动画:D