java.lang.RuntimeException:在线程中生成世界时,在当前线程中找不到OpenGL上下文



我正在用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中,确实没有太多情况需要这样做,而且几乎每次它都能被框架很好地处理

最新更新