【问题标题】:LWJGL/OpenGL implementation causes NullPointerException errorLWJGL/OpenGL 实现导致 NullPointerException 错误
【发布时间】:2015-05-02 06:52:27
【问题描述】:
package com.flappygame.flappy;

import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL13.*;
import static org.lwjgl.system.MemoryUtil.*;

import java.nio.ByteBuffer;

import org.lwjgl.glfw.GLFWvidmode;
import org.lwjgl.opengl.GLContext;

public class Main implements Runnable {

    private int width = 1280;
    private int height = 720;

    private Thread thread;
    private boolean running = false;

    private long window;


    public void start() {
        running = true;
        thread = new Thread(this, "Game");
        thread.start();
    }

    private void init() {
        if (glfwInit() != GL_TRUE) {
            System.err.println("Could not initialize GLFW!");
            return;
        }

        //glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
        //glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);
        //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
        glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
        window = glfwCreateWindow(width, height, "Flappy", NULL, NULL);
        if (window == NULL) {
            System.err.println("Could not create GLFW window!");
            return;
        }

        ByteBuffer vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());     
        glfwSetWindowPos(window, (GLFWvidmode.width(vidmode) - width) / 2, (GLFWvidmode.height(vidmode) - height) / 2);

        glfwMakeContextCurrent(window);
        glfwShowWindow(window);     
        //System.out.println("OpenGL version: " + glGetString(GL_VERSION));
    }

    public void run() {
        init();
        while (running) {
            update();
            render();

            if (glfwWindowShouldClose(window) == GL_TRUE) {
                running = false;
            }

        }
    }

    private void update() {
        glfwPollEvents();
    }

    private void render() {
        glfwSwapBuffers(window);
    }

    public static void main(String[] args) {
        new Main().start();
    }

}

(这是我的全部代码)

首先,我使用本教程中的代码https://www.youtube.com/watch?v=527bR2JHSR0(GitHub 存储库:https://github.com/TheCherno/Flappy)。我一步一步编写这段代码,但我坚持......运行它(太荒谬了,我只制作了主文件)。重要的是,IMO,我在 Mac OS X 10.10.3 上使用 Eclipse。 OFC 我已经添加了所有 LWJGL 库。这是我每次(fu...)运行代码时遇到的控制台错误:

Could not create GLFW window!
Exception in thread "Game" java.lang.NullPointerException
at org.lwjgl.system.Checks.checkPointer(Checks.java:66)
at org.lwjgl.glfw.GLFW.glfwSwapBuffers(GLFW.java:2578)
at com.radnok.flappy.Main.render(Main.java:74)
at com.radnok.flappy.Main.run(Main.java:60)
at java.lang.Thread.run(Thread.java:745)

这里有什么问题? 我对 OpenGL 版本有问题(注释行)。也许是因为它?

【问题讨论】:

    标签: java eclipse opengl lwjgl


    【解决方案1】:

    “无法创建 GLFW 窗口!”消息非常清楚发生了什么。您没有得到 GLFW 窗口,但在这种情况下您没有中止程序,并继续使用您的 render() 函数,将 NULL 馈送到 glfWindowShouldClose()

    如果您不打算请求某些 >= 3.2 核心配置文件上下文,您确实应该删除 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);。但是尝试请求 GL 4.4 上下文也不适用于 OSX。使用您的操作系统实际支持的东西。

    【讨论】:

    • 当我删除 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 时,我只能在控制台中看到一堵红色错误墙 类似:*** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /SourceCache/Foundation/Foundation-1153.20/Misc.subproj/NSUndoManager.m:340java[3925:2167638] +[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.
    • 嗯,这是一个全新的问题,与 OpenGL 完全无关。
    • 我认为它与OpenGL有关,但与Java无关。也许这与 Eclipse 配置有关?我正在使用最新的 JDK 和 LWJGL 版本。在 Apple 的网站上,我可以在支持 OpenGL 4.1 的列表中找到我的 Macbook。事实上,在兼容性配置文件上,我有 2.1 版,在核心配置文件 4.1 上。我怎样才能切换它,或者......我没有。这就是我需要帮助的原因。我是使用 Java/Eclipse 的新手。没想到会出现环境问题。
    • 和GL完全没有关系。您收到的错误消息是 OSX 的 API 之一。简单的解决方案似乎是在主线程中进行事件处理,正如错误消息实际上所暗示的那样(我也看不出有任何理由创建一个单独的线程)。但是,我不是 OSX 专家,您真的应该为此提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多