我正在用LibGDX制作一款2D沙盒游戏(比如terraria)。不过我遇到了一个问题。我需要在另一个线程中生成世界,这样程序就可以在生成时渲染动画加载屏幕。我把生成代码放在一个新线程中。当我运行它时,我收到这个错误:
Exception in thread "Thread-1" java.lang.RuntimeException: No OpenGL context found in the current thread.
为什么会发生这种情况,我该如何解决?当生成器运行时,它需要创建一个需要OpenGL的精灵,但它似乎不喜欢在单独的线程中运行。有什么见解吗?
OK已解决。
Libgdx有一个甜蜜的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
也许可以在新线程中以某种方式创建GL上下文(但我不确定,因为我从来没有这样做过),但你为什么要用这种方式来实现这一点?:)
不需要创建新的线程来加载资源/生成世界,只需渲染一些"加载"标签/动画-任何您想要的东西,并在完成后开始渲染世界。
如果你试图加载一些资产,你应该使用AssetManager和它的更新方法来检查资产是否已加载,比如
AssetManager assetManager = new AssetManager();
//load assets
...
//render method
if(assetManager.update())
{
//render world or even change screen to game screen
}
else
//render "loading"
如果你试图生成一个世界,只需将此操作分割成块(如生成正方形N x N),并有一个方法来完成此操作,只需添加一些控件来检查操作是否完成-它可以是一些枚举、标志、方法。。。所以假设你有类WorldGenerator,它会像一样
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中,确实没有太多情况需要这样做,而且几乎每次它都能被框架很好地处理