我了解了glutdisplayfunc()如何使显示循环和Iv在某些地方读取时,您应该将游戏机制置于显眼位置而不是显示位置。您为什么不能只将它们放在一段时间(游戏运行)循环中?

最佳答案

在事件驱动的编程中,就像在交互式OpenGL应用程序中一样,主应用程序循环通常执行三件事:

  • 检查当前事件队列,并处理自上次检查
  • 之后发生的所有事件(例如,鼠标移动,按键等)。
  • 更新应用程序状态-如玩家和对象的位置,游戏物理等-准备下一个渲染帧
  • 渲染当前帧。

  • GLUT会在您的glutMainLoop()中隐式地执行这些步骤。您注册的几乎所有GLUT回调(例如glutKeyboardFunc()glutReshapeFunc()等)都会处理1.,并且设置的调用函数可能会执行2。

    现在,如果您使用glutIdleFunc()注册了一个空闲函数,则在处理所有当前事件之后调用该函数。程序员通常会实现其空闲函数,以仅调用用于渲染场景的例程(即,传递给glutDisplayFunc()的例程)。如果渲染“花了一段时间”(例如几乎所有时间都渲染一帧),则此方法可能会出现问题,因为您可能没有时间完成渲染,然后处理下一帧的事件。如果要插入提到的while循环,那么您将这样做,而这将绕过GLUT的 native 事件处理机制。更好地与GLUT配合使用的更好方法是将您的闲置函数实现为仅调用glutPostRedisplay(),这会告诉GLUT在所有事件都已处理之后并且在调用闲置函数之前安排对显示函数的调用。

    08-16 02:01