【问题标题】:java.lang.RuntimeException: No OpenGL context found in the current thread while generating world in threadjava.lang.RuntimeException:在线程中生成世界时,在当前线程中找不到 OpenGL 上下文
【发布时间】:2015-12-20 02:08:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: java multithreading opengl libgdx lwjgl


    【解决方案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

    【讨论】:

      【解决方案2】:

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

      无需创建新线程来加载资产/生成世界,只需渲染一些“正在加载”标签/动画 - 任何您想要的内容,并在完成后开始渲染世界。

      如果您尝试加载一些资产,您应该使用 AssetManagerupdate 方法来检查资产是否已加载 - 类似

          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 中,确实没有多少情况需要这个,而且几乎每次它都被框架很好地处理

      【讨论】:

      • 我调查了它,显然它不是 libGDX 的一个选项,如下所述:github.com/libgdx/libgdx/wiki/Threading 很好的答案,谢谢:D
      • 另外,我为什么要这样做。生成代码冻结了所有内容,阻止我的“生成世界...”加载屏幕为状态栏设置动画:D
      猜你喜欢
      • 2013-04-18
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多