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

时间:2015-12-20 02:08:36

标签: java multithreading opengl libgdx lwjgl

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

Exception in thread "Thread-1" java.lang.RuntimeException: No OpenGL context found in the current thread.

为什么会发生这种情况,我该如何解决?当生成器运行时,它需要创建一个需要OpenGL的Sprite,但它似乎不喜欢在单独的线程中运行。任何见解?

2 个答案:

答案 0 :(得分:1)

也许有可能以某种方式在一个新线程中创建一个GL上下文(但我不确定,因为我还没有这样做过)但是为什么你想要以这种方式实现这个目标? :)

而不是创建新的线程来加载资源/生成世界只需渲染一些“加载”标签/动画 - 你想要的任何东西,并在完成后开始渲染世界。

如果您尝试加载某些资源,则应使用AssetManager及其update方法检查资产是否已加载 - 例如

    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中,实际上并不是很多情况下你需要这个并且几乎每次它都被框架很好地处理

答案 1 :(得分:1)

好的解决了。

Libgdx有一个甜蜜的工具,可以将代码从新线程发布到主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