glfw pollevents() 真的非常慢

glfw pollevents() really, really slow

我一直在对我的游戏引擎进行一些基准测试,发现了一个错误的罪魁祸首:

glfwPollevents();

我已经彻底计时,95% 的时间它的行为符合预期,但有时它会占用我更新间隔的 5-200%(即 1/60 秒)。我真的不知道是什么原因造成的。在这些巨大的投票中,我定义的回调没有被调用。一切都静悄悄的。完全变幻莫测。

我有几个理论: 1. 调度程序在函数内某处中断。这不太可能,我会在我的循环的其他部分看到相同的行为,但我没有。

  1. 有一些我不知道的邪恶回调,在某个地方被调用并消耗时间。

  2. lwjgl 问题。 LWJGL 是 glfw 的包装器,因此它可以用于 Java,我也这样做。

  3. 驱动程序,但是哪个?

glfwPollEvents();是 OS 特定系统调用的包装器,使您能够检查应用到 window 的任何事件。有很多东西可以算作事件,包括用户级的东西,比如选择 window 或调整 window 的大小,还包括 GLFW 不允许您访问的系统级的东西。有很多事情可能会像您描述的那样导致短暂 interrupts/hangs。

一般来说,最好的建议是在不同的线程上处理渲染,并使用消息队列来指示主线程执行 "main thread critical tasks"(比如打开一个新的 window 或其他类似的重要任务)。