Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 初始化后OpenGL窗口冻结_Java_Opengl_Lwjgl - Fatal编程技术网

Java 初始化后OpenGL窗口冻结

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

我试图学习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 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
?@apilat
glViewport
是OpenGL 1.0(可能在
GL11
类中找到),但您不需要它在窗口上简单地显示对象。只有在调整窗口大小时才需要它。
GLContext
实际上已在LWJGL 3 beta版中删除-
GL。所需的全部是createCapabilities
。哪个OpenGL版本是?@apilat
glViewport
中的
glViewport
是OpenGL 1.0(可能在
GL11
类中找到)但您不需要它来简单地在windo上显示对象