glutidlefunc() 在 freeglut 中的意义何在

What's the point of glutidlefunc() in freeglut

本文关键字:freeglut glutidlefunc      更新时间:2023-10-16

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

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

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

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

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