我尝试多线程化我的应用程序,但是当我尝试从主窗口共享上下文时,程序崩溃了。
[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
答案 0 :(得分:1)
这里至少有一个问题是你从不同的线程调用glfwCreateWindow
,而
只能从主线程调用此函数。 [ref]
您必须在基于ConcurrentLinkedQueue
的线程之间实现消息传递,或者除了主要线程之外的每个线程只执行窗口创建请求,而主线程必须侦听这些请求并使用此函数进行实际创建调用
答案 1 :(得分:0)
如果Grief的答案不起作用,您还必须确保仅在资源共享glfwCreateWindow
和已与此共享共享的窗口中的任何一个当前不能使用window
时调用glfwCreateWindow
线程。
来自GLFW.glfwMakeContextCurrent(0)
javadoc:
Windows:共享资源的上下文可能不是任何其他线程上的当前上下文。 [ref]
您可以通过在主线程(或创建主窗口的线程)中调用mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
Log.d(TAG, "Problem setting up In-app Billing: " + result);
}
}
});
来执行此操作,然后在第二个线程中创建包含共享的窗口。