【问题标题】:LWJGL - How do I use a second thread to load texturesLWJGL - 如何使用第二个线程加载纹理
【发布时间】:2015-12-18 14:00:49
【问题描述】:

我知道这个问题已经被问过好几次了,我在任何地方都找不到完美的答案。

我一直在尝试使用 LWJGL 中的第二个线程来加载纹理,而在加载纹理时进度条会在显示屏上填满。我已经编写了所有代码,但是当我开始第二个线程,它返回一个异常,即:

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

我在主线程中使用 OGL 来渲染场景。当那个场景正在渲染它的东西时,我想加载纹理。

我尝试将线程设为Daemon Thread,但返回相同的错误。

如何确保“纹理加载”线程正在加载其纹理,而主线程正在更新其场景?

或者有其他方法吗?

一些代码:

mainScreen = new MainScreen();

MainScreen.java:

public void update() {
    gameInitialiser.start();

    do {
        updateGameInitialiser();
        super.update();

        SceneRenderer.renderScene();
        GuiRenderer.renderGui();

        DisplayManager.updateDisplay();
    } while(!Keyboard.isKeyDown(Keyboard.KEY_ESCAPE));

}

public void updateGameInitialiser() {

    if(gameInitialiser.isInterrupted()) {
        System.err.println("The Game Initialiser has been interrupted..");
    } else if(!gameInitialiser.isAlive()) {
        System.out.println("The Game Initialiser has been ended!");
    }
}

【问题讨论】:

    标签: java multithreading opengl textures lwjgl


    【解决方案1】:

    一个OpenGL上下文总是只属于一个线程,所以不可能在多个线程中同时使用一个上下文。

    您可以做的是使用两个上下文,每个线程一个。这可以通过使用所谓的shared-context 来实现,如果两个上下文基本上具有相同的对象(纹理、缓冲区等),但它们具有不同的状态。然后您可以使用一种上下文来渲染场景,而另一种则用于上传新数据。

    补充阅读:

    Apple - OpenGL Threading

    OpenGL.org - Multithreading

    【讨论】:

    • 如何创建共享上下文?我是 Java 线程的新手,所以我不太了解它..
    • 您查看过lwjgl mutlithreading example 吗?他们在那里做你想做的事。
    【解决方案2】:

    BDL 关于使用 OpenGL 共享上下文的答案可能是您想要的,假设它在 LWJGL 中得到适当支持。

    但另一种方法是将图像加载移动到加载线程。您可以将创建纹理的 OpenGL 调用的任务交给渲染线程。

    通常是磁盘访问和图像文件解析比较慢,如果渲染线程正在进行 OpenGL 调用,它可能不会妨碍平滑加载屏幕。

    我发现这种技术在 Android 上很有用,因为它缺乏对共享 opengl 上下文的完全支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-04
      • 2017-09-27
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      相关资源
      最近更新 更多