freeglut中glutidlefunc()的重点是什么?

时间:2013-03-27 22:16:41

标签: c++ opengl glew freeglut

我得到了glutdisplayfunc()如何使显示循环和Iv在一些地方读取你应该把游戏机制放在glutidle而不是显示;为什么你不能把它们放在一段时间(游戏运行)循环?

1 个答案:

答案 0 :(得分:18)

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

  1. 检查当前事件队列,并处理自上次检查以来发生的任何事件(例如,鼠标移动,按键等)
  2. 更新应用程序状态 - 诸如玩家和对象位置,游戏物理等等 - 准备下一个渲染帧
  3. 渲染当前帧。
  4. GLUT为您glutMainLoop()隐式执行这些步骤。您注册的几乎所有GLUT回调(例如glutKeyboardFunc()glutReshapeFunc()等)都会处理1.,并且您调用的函数可能会设置为2.

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