如何在 GLUT 中调度函数
Posted
技术标签:
【中文标题】如何在 GLUT 中调度函数【英文标题】:How to schedule function in GLUT 【发布时间】:2011-04-07 17:35:24 【问题描述】:我有一些从主函数调用的函数。下面是代码。
int main(int argc, char *argv[])
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow("Game for Gamers");
glutDisplayFunc(display_func);
glutKeyboardFunc(keyboard);
glutSpecialFunc(special);
glutTimerFunc(50,refreshcheck,0);
glutIdleFunc (animate);
glutReshapeFunc (reshape);
glutMainLoop();
return 0;
这里“refreshcheck”首先调用我想在执行“display_func”函数后调用“refreshcheck”函数。如何安排它。我想在“refreshcheck”之前在内存中加载游戏时首先调用“display_func”执行函数函数,游戏运行时,display_func之后不需要调用refreshcheck,但第一次很重要。
【问题讨论】:
refreshcheck 里面有什么?可能有一种方法可以避免使用计时器。 在这个函数中,我为每个球和平面上的移动对象使用了碰撞检测检查模块。display_func 正在创建对象,这就是我想要调用它的原因。 我可以用逻辑控制,但我正在寻找一些 Glut 的标准用法。 您不应在 display_func 中创建对象。在进入 glutMainLoop 之前调用的另一个函数中创建它们。 【参考方案1】:一般来说,您不应该在 displayFunc 中创建对象(正如 dark_charlie 正确指出的那样)。但这只是不好的做法,仅此而已。
如果你需要碰撞检测,你应该让它与渲染同步,即从你的 displayFunc 调用它(在它结束时)。
我猜你想使用计时器的原因是要有恒定的步长物理。这通常以另一种方式完成,使用 gettimeofday()(或 Windows 上的 GetTickCount())来获取时间,并根据帧之间经过的时间,物理调用 N 次。与使用 GLUT 计时器相比,这将使您获得更好的精度,因为计时器的精确度最高只有 10 毫秒,这在处理快速移动的物体时可能会很多,从而导致卡顿。
【讨论】:
以上是关于如何在 GLUT 中调度函数的主要内容,如果未能解决你的问题,请参考以下文章