使用LWJGL从GLFW的主线程发货

时间:2015-07-08 00:29:12

标签: java opengl lwjgl glfw

我试图在每个 tick (在这种情况下为1/30秒)运行的异步任务中调用GLFW.glfwPollEvents()。这个滴答计时器有效地控制应用程序中的每个动作何时发生。

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run(){
        //... more code ...

        GLFW.glfwPollEvents();

        //... more code ...
    }
}, 33, 33);

但是,这不起作用,因为

  

此功能只能从主线程调用。

     

(来自文档)

如何在主线程上调用它?当它不在主线程上运行时,应用程序崩溃。我正在寻找像

这样的东西
GLFW.dispatchMainThread(new GLFWRunnable(){
    public void run(){
        //...
    }
});

使用

可以在swingawt中执行此操作
EventQueue.invokeLater(new Runnable(){
    public void run(){
        //...
    }
});

但是相同的代码对GLFW无效。

如何在GLFW主线程上使用LWJGL 在没有的情况下使用主线程上的while(true)循环运行任务?

1 个答案:

答案 0 :(得分:2)

由于GLFW的主线程必须与应用程序的主线程相同(GLFW中的限制;这就是它放置了由swing / awt以不同方式处理的OS消息队列的位置 - 请参阅我的回答here)我会反过来做事。

我的主线程将有永久循环(可能使用glfwWaitEvents,以免不必要地占用CPU时间)。然后,我会将任何特定于应用程序的事件发布到执行处理的另一个线程。您的邮件处理现在与您的邮件接收分离。

这样我就不必等待1/30秒来获取操作系统消息(当应用程序滞后打开菜单,注册点击或浏览列表时,它总是让我感到沮丧。)

您的更新线程甚至可以休眠1/30秒(或更少,如果没有足够的时间再次休眠,或者如果第二个高优先级队列需要工作则再次休眠)并且仅唤醒以检查排队事件为一种非常简单的调度方法。

我上面链接的答案有LWJGL Multithreaded Demo的链接,它做了非常相似的事情。他们的renderLoop将是你的updateLoop并将从队列中抽取并在再次进入睡眠状态之前进行处理,而不是更新和呈现图形。