我尝试对我的应用程序进行多线程处理,但是当我尝试从主窗口共享上下文时,程序崩溃了。
[LWJGL]
GLFW_VERSION_UNAVAILABLE
error
Description : WGL: Failed to create OpenGL context
Stacktrace :
org.lwjgl.glfw.GLFW.nglfwCreateWindow(GLFW.java:1361)
org.lwjgl.glfw.GLFW.glfwCreateWindow(GLFW.java:1521)
以下是主窗口的创建代码:
GLFWErrorCallback.createPrint(System.err).set();
if (!glfwInit()) {
throw new IllegalStateException("Unable to initialize GLFW");
}
glfwDefaultWindowHints();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
if(fullscreen){
window = glfwCreateWindow(vidmode.width(), vidmode.height(), windowTitle, glfwGetPrimaryMonitor(), NULL);
Var.windowSizeX=vidmode.width();
Var.windowSizeY=vidmode.height();
}else{
window = glfwCreateWindow(windowSizeX, windowSizeY, windowTitle, NULL, NULL);
glfwSetWindowPos(window, (vidmode.width() - windowSizeX) / 2, (vidmode.height() - windowSizeY) / 2);
}
if (window == NULL) {
throw new RuntimeException("Failed to create the GLFW window");
}
glfwMakeContextCurrent(window);
if (vSync) {
glfwSwapInterval(1);
} else {
glfwSwapInterval(0);
}
GL.createCapabilities();
我的第二个线程中的代码:
GLFW.glfwWindowHint(GLFW.GLFW_VISIBLE, GLFW.GLFW_FALSE);
offsiteWindow = GLFW.glfwCreateWindow(1, 1, "offsite", MemoryUtil.NULL, window);//errors
GLFW.glfwMakeContextCurrent(offsiteWindow);
GL.createCapabilities();
我做错了什么? 版本:稳定版 LWJGL 3.1.3 快照版本 1
这里至少有一个问题是你从不同的线程调用glfwCreateWindow
,而
此函数只能从主线程调用。[参考资料]
您必须基于ConcurrentLinkedQueue
或其他方式在线程之间实现消息传递,仅从除主线程之外的每个线程创建窗口的请求,而主线程必须侦听这些请求并使用此函数调用进行实际创建
如果 Grief 的答案不起作用,您还必须确保仅当资源共享window
并且已与此共享的窗口在任何线程中都不是最新的时才调用glfwCreateWindow
。
从 javadocglfwCreateWindow
Windows:要与之共享资源的上下文在任何其他线程上可能不是最新的。[参考资料]
为此,可以在主线程(或创建主窗口的线程(中调用GLFW.glfwMakeContextCurrent(0)
,然后在第二个线程中创建具有共享的窗口。