我想了解窗口应用程序(如 FreeGLUT、GLFW)中的回调函数是如何工作的。
他们每秒检查键盘/鼠标/调整大小事件多少次?
它取决于帧速率,是恒定的还是特定于操作系统的?
一般来说,在不涉及 Unix 或 Windows 实现的细节的情况下,回调是从一个大致如下所示的主事件循环调用的:
Loop forever {
Get a message from the event queue.
Process the message
}
如果“获取消息”阶段等待消息出现在队列中,它将有一个非常小的睡眠,可能不到一毫秒。事件队列将包含与应用程序相关的每条消息,包括鼠标按钮按下、鼠标移动事件、键盘事件和窗口事件(如调整大小和公开)。
“处理消息”步骤将接收一个事件并将其分派给与该事件相关的任何内容。因此,例如,鼠标单击可能会导致调用 Button 小部件的回调。或者,如果您的 OpenGL 绘图区域设置了输入处理程序回调,则鼠标单击将导致调用该函数。
以下是一些资源,可用于了解有关该过程的更多信息:
对于 Windows:http ://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows
对于 X/Motif:http ://www.unix.com/man-page/all/3x/XtAppMainLoop/
如果您想查看沿途的具体步骤(有很多),您可以尝试在您感兴趣的函数中设置断点,例如您的主要 OpenGL 绘制例程或输入回调函数。然后调用堆栈会告诉你你是如何到达那里的。