2016-05-19 1 views
1

У меня есть «-XstartOnFirstThread» в моих аргументов VM, но я все еще получаю сообщение об ошибке:GLFW Window сбоями Даже с «-XstartOnFirstThread» В VM Аргументы

Exception in thread "Thread-0" java.lang.ExceptionInInitializerError 
    at org.lwjgl.glfw.GLFW.glfwCreateWindow(GLFW.java:1248) 
    at Main.init(Main.java:33) 
    at Main.run(Main.java:56) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.IllegalStateException: GLFW windows may only be created on the main thread. 
    at org.lwjgl.glfw.EventLoop$OffScreen.<clinit>(EventLoop.java:39) 
    ... 4 more 

Мой код:

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

import org.lwjgl.glfw.*; 


public class Main implements Runnable { 

    private Thread thread; 
    private boolean running; 

    public long window; 

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

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

    public void init() { 
     if(glfwInit() != GL_TRUE) { 
      System.err.println("GLFW Initialization Failed!"); 
     } 

     glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); 

     window = glfwCreateWindow(800, 600, "test", NULL, NULL); 

     if(window == NULL) { 
      System.err.println("Could not create our window!"); 
     } 

     GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); 
     glfwSetWindowPos(window, 100, 100); 

     glfwMakeContextCurrent(window); 

     glfwShowWindow(window); 
    } 

    public void update() { 
     glfwPollEvents(); 
    } 

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

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

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

} 

Я задаю этот вопрос здесь, потому что я огляделся и не видел решения, размещенного для этого в другом месте. Спасибо за помощь!

ответ

0

Прямо сейчас вы начинаете свою программу в основном потоке, но сразу же создаете новый поток, который создает окно. В LWJGL вы должны делать все вызовы GLFW и рендеринг OpenGL в основном потоке. Вы можете использовать другие потоки для создания VBOs, загрузки текстур, вычисления физики и т. Д.