Java 初始化后OpenGL窗口冻结
我试图学习LWJGL 3,但在我创建了一个窗口后,它在打开应用程序后立即冻结 我尝试重新安装LWJGL并在另一台计算机上运行该应用程序,但没有任何区别 我的代码是错的还是硬件问题Java 初始化后OpenGL窗口冻结,java,opengl,lwjgl,Java,Opengl,Lwjgl,我试图学习LWJGL 3,但在我创建了一个窗口后,它在打开应用程序后立即冻结 我尝试重新安装LWJGL并在另一台计算机上运行该应用程序,但没有任何区别 我的代码是错的还是硬件问题 import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.system.MemoryUtil.*; import org.lwjgl.opengl.GL; public cl
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryUtil.*;
import org.lwjgl.opengl.GL;
public class Game implements Runnable{
private Thread thread;
private long window;
private boolean running = false;
public static void main(String[] args){
new Game().start();
}
public void start(){
running = true;
thread = new Thread(this);
thread.start();
}
@Override
public void run() {
float fps = 60;
float ns = 1000000000 / fps;
float delta = 0;
long last = System.nanoTime();
init();
while(running){
delta += (System.nanoTime() - last) / ns;
while(delta-- >= 1){
update();
}
render();
last = System.nanoTime();
if(glfwWindowShouldClose(window) == GL_TRUE) running = false;
}
}
public void init(){
if(glfwInit() != GL_TRUE){
System.exit(1);
}
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
window = glfwCreateWindow(800, 640, "OpenGL Test", NULL, NULL);
if(window == NULL){
System.exit(1);
}
glfwMakeContextCurrent(window);
GL.createCapabilities();
glfwSetWindowPos(window, 300, 300);
glfwShowWindow(window);
}
public void update(){
glfwPollEvents();
}
public void render(){
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
}
}
为了执行OpenGL渲染,必须有一个视口,并且必须从当前视口创建一个上下文。在初始化方法中,在代码末尾添加以下两行:
GLContext.createFromCurrent()代码>
glViewport(0,0,宽度,高度)代码>为了执行OpenGL渲染,必须有一个视口,并且必须从当前视口创建一个上下文。在初始化方法中,在代码末尾添加以下两行:
GLContext.createFromCurrent()代码>
glViewport(0,0,宽度,高度)
您需要让应用程序的主线程(与公共静态void main(String[]args)
关联的线程)调用glfwPollEvents()
在循环中继续,直到窗口关闭,以便程序向操作系统确认它处于活动状态、未挂起状态且正常运行。这是Windows、MacOS和Linux中所有窗口api所必需的,但在许多窗口api(如Swing和AWT)中,这通常是从用户那里抽象出来的
如果您对为什么需要这样做的语义感到好奇,您可能希望在C++中(相对)低级Win32 API中创建一个窗口。 < p>您需要有应用程序的主线程(与代码相关联的线程>公共静态空隙main(String []ARGs)< /CUL> >)调用<代码> GLFWPOLLVENTSH();code>在循环中继续,直到窗口关闭,以便程序向操作系统确认它处于活动状态、未挂起状态且正常运行。这是Windows、MacOS和Linux中所有窗口api所必需的,但在许多窗口api(如Swing和AWT)中,这通常是从用户那里抽象出来的
如果你对为什么需要这样做的语义感到好奇,你可能希望在C++(相对)低级别的Win32 API中创建一个窗口。
< P>大部分的GLFW函数只能从主线程调用(这就是为什么它不能很好地使用AWT——都需要主线程)。虽然有些函数可以从其他线程使用,但核心函数(如初始化和事件处理)需要主线程
引自:
线程安全
大多数GLFW函数只能从主线程调用,但有些函数可以从任何线程调用。但是,在主线程上成功初始化GLFW之前,不能从任何其他线程调用GLFW函数,包括初始化之前可能调用的函数
每个GLFW函数的参考文档说明它是否仅限于主线程
由于一个或多个平台的限制,初始化和终止、事件处理以及窗口、上下文和游标的创建和销毁都仅限于主线程
因为事件处理必须在主线程上执行,所以除了错误回调之外的所有回调都将仅在该线程上调用。错误回调可以在任何线程上调用,因为任何GLFW函数都可能生成错误
可以从任何线程发布空事件。也可以从任何线程访问和修改窗口用户指针和关闭标志,但GLFW不同步。可以从任何线程调用以下与窗口相关的函数:
因此,您必须从主线程调用GLFW函数;它们不能在自定义的线程的运行方法中工作。大多数GLFW函数只能从主线程调用(这就是为什么它不能很好地与AWT配合使用-两者都需要主线程)。虽然有些函数可以从其他线程使用,但核心函数(如初始化和事件处理)需要主线程
引自:
线程安全
大多数GLFW函数只能从主线程调用,但有些函数可以从任何线程调用。但是,在主线程上成功初始化GLFW之前,不能从任何其他线程调用GLFW函数,包括初始化之前可能调用的函数
每个GLFW函数的参考文档说明它是否仅限于主线程
由于一个或多个平台的限制,初始化和终止、事件处理以及窗口、上下文和游标的创建和销毁都仅限于主线程
因为事件处理必须在主线程上执行,所以除了错误回调之外的所有回调都将仅在该线程上调用。错误回调可以在任何线程上调用,因为任何GLFW函数都可能生成错误
可以从任何线程发布空事件。也可以从任何线程访问和修改窗口用户指针和关闭标志,但GLFW不同步。可以从任何线程调用以下与窗口相关的函数:
因此,您必须从主线程调用GLFW函数;它们不会在自定义的线程运行方法中工作。哪个OpenGL版本是glViewport
?@apilatglViewport
是OpenGL 1.0(可能在GL11
类中找到),但您不需要它在窗口上简单地显示对象。只有在调整窗口大小时才需要它。GLContext
实际上已在LWJGL 3 beta版中删除-GL。所需的全部是createCapabilities
。哪个OpenGL版本是?@apilatglViewport
中的glViewport
是OpenGL 1.0(可能在GL11
类中找到)但您不需要它来简单地在windo上显示对象