我知道已经多次询问过这个问题,我无法在任何地方找到完美答案。
我一直试图在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!");
}
}
答案 0 :(得分:3)
OpenGL上下文总是只属于一个线程,因此不可能在多个线程中同时使用一个上下文。
你可以做的是使用两个上下文,每个线程一个。这可以通过使用所谓的shared-context来实现,两个上下文基本上具有相同的对象(纹理,缓冲区等),而它们具有分离的状态。然后,您可以使用一个上下文来渲染场景,另一个上传新数据。
附加读物:
答案 1 :(得分:1)
BDL关于使用OpenGL共享上下文的答案可能是你想要的,假设它在LWJGL中得到了适当的支持。
但另一种方法是将图像加载移动到加载线程。您可以将创建纹理的OpenGL调用交给渲染线程。
磁盘访问和映像文件解析通常是缓慢的,如果渲染线程正在进行OpenGL调用,它可能不会妨碍平滑的加载屏幕。
我发现这种技术在Android上很有用,因为它缺乏对共享opengl上下文的完全支持。