我试图在每个 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(){
//...
}
});
使用
可以在swing
和awt
中执行此操作
EventQueue.invokeLater(new Runnable(){
public void run(){
//...
}
});
但是相同的代码对GLFW
无效。
如何在GLFW
主线程上使用LWJGL 在没有的情况下使用主线程上的while(true)
循环运行任务?
答案 0 :(得分:2)
由于GLFW的主线程必须与应用程序的主线程相同(GLFW中的限制;这就是它放置了由swing / awt以不同方式处理的OS消息队列的位置 - 请参阅我的回答here)我会反过来做事。
我的主线程将有永久循环(可能使用glfwWaitEvents,以免不必要地占用CPU时间)。然后,我会将任何特定于应用程序的事件发布到执行处理的另一个线程。您的邮件处理现在与您的邮件接收分离。
这样我就不必等待1/30秒来获取操作系统消息(当应用程序滞后打开菜单,注册点击或浏览列表时,它总是让我感到沮丧。)
您的更新线程甚至可以休眠1/30秒(或更少,如果没有足够的时间再次休眠,或者如果第二个高优先级队列需要工作则再次休眠)并且仅唤醒以检查排队事件为一种非常简单的调度方法。
我上面链接的答案有LWJGL Multithreaded Demo的链接,它做了非常相似的事情。他们的renderLoop将是你的updateLoop并将从队列中抽取并在再次进入睡眠状态之前进行处理,而不是更新和呈现图形。