LWJGL - 如何使用第二个线程加载纹理

时间:2015-12-18 14:00:49

标签: java multithreading opengl textures lwjgl

我知道已经多次询问过这个问题,我无法在任何地方找到完美答案。

我一直试图在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!");
    }
}

2 个答案:

答案 0 :(得分:3)

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

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

附加读物:

Apple - OpenGL Threading

OpenGL.org - Multithreading

答案 1 :(得分:1)

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

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

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

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