我有一个非常简单的游戏循环。
public void gameLoop() {
long now;
long updateTime;
long wait;
final int TARGET_FPS = 60;
final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;
while (!window.shouldClose()) {
now = System.nanoTime();
update();
render();
frame++;
updateTime = System.nanoTime() - now;
wait = (OPTIMAL_TIME - updateTime) / 1000000;
try {
Thread.sleep(wait);
} catch (Exception e) {
}
}
glfwTerminate();
}
每当我单击窗口的头部(关闭和最小化按钮所在的栏)时,循环出于某种原因暂停。游戏中的声音会继续播放(我使用的是AL10),所以这会导致音乐和声音与游戏不同步。我想在发生这种情况时暂停窗口。
我但是通过GLFW回调,似乎没有一个解决这个问题。焦点回调只工作,如果我点击窗口外,windowPos回调只工作每当窗口被移动,而不是当你简单地点击并按住窗口头。
有办法解决这个问题吗?
这实际上是在某些平台上的预期行为,例如Windows,只要你按住鼠标按钮和/或可能拖动/移动窗口,glfwPollEvents
就会有效地阻塞Win32 API调用。
为了解决这个问题,你应该让你的游戏循环独立于窗口事件处理循环,使用单独的线程。
主线程必须处理窗口事件(glfwPollEvents
或glfwWaitEvents
),以保持与macOS等其他平台的要求一致,而另一个线程可以做游戏更新和渲染。