我想了解窗口应用程序(如FreeGLUT,GLFW)中的回调函数是如何工作的。
他们每秒检查键盘/鼠标/调整大小事件的次数是多少次?
是否取决于帧速率,它是否恒定或可能是特定于操作系统?
答案 0 :(得分:1)
一般来说,在没有涉及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绘图例程或输入回调函数。然后调用堆栈将显示你是如何到达那里的。