10

我知道 glutdisplayfunc() 如何使显示循环,并且我在某些地方读到您应该将游戏机制放在 glutidle 而不是显示中;为什么你不能把它们放在一个 while (gameisrunning) 循环中?

4

1 回答 1

26

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

  1. 检查当前事件队列,并处理自上次检查以来发生的任何事件(例如,鼠标移动、按键等)
  2. 更新应用程序状态——比如玩家和对象位置、游戏物理等——为下一个渲染帧做准备
  3. 渲染当前帧。

GLUTglutMainLoop()为您隐含地执行这些步骤。您注册的几乎所有 GLUT 回调(例如 、glutKeyboardFunc()glutReshapeFunc())都会处理 1.,并调用您设置为大概执行 2 的函数。

现在,如果您使用 注册一个空闲函数glutIdleFunc(),它会在处理完所有当前事件后调用。通常,程序员实现他们的空闲函数只是为了调用他们用于渲染场景的例程(即,他们传入的例程glutDisplayFunc())。如果渲染“需要一段时间”(例如接近所有时间来渲染一帧),这种方法可能会出现问题,因为您可能没有时间完成渲染然后处理下一帧的事件。如果您要插入您提到的 while 循环,您就会这样做,这会绕过 GLUT 的本机事件处理机制。更好地使用 GLUT 的更好方法是实现你的空闲函数只调用glutPostRedisplay(),它告诉 GLUT 在处理完所有事件并在调用空闲函数之前安排对显示函数的调用。

于 2013-03-27T22:34:50.900 回答