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

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

我正在用LibGDX制作一个2D沙盒游戏(比如terraria)。不过我遇到了一个问题。我需要在另一个线程中生成世界,以便程序可以在生成时渲染动画加载屏幕。我将生成代码放在一个新线程中。运行时,我收到以下错误:

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