暂时停止在OpenGL中

时间:2014-10-13 11:34:09

标签: c++ opengl visual-c++ sleep

void keyPress(unsigned char key,int x,int y){
    int i;
    switch(key){
    case 'f':
        i = 3;
        while(i--){
            x_pos += 3;
            sleep(100);
            glutPostRedisplay();
        }
    }
}
  • 上面是在Windows 7中使用GLUT库用C ++编写的代码片段。

  • 此功能采用字符键和鼠标坐标x,y,并在按下f字符的3个连续步骤中沿x方向执行平移。在每个步骤之间程序应该睡眠100毫秒。

  • 我们想要移动一个机器人,并在他前进的步骤中连续停顿。

  • 我们正面临着让程序在3个步骤之间休眠的问题。上面的代码片段有什么问题?

2 个答案:

答案 0 :(得分:3)

免责声明: jozxyqk的答案对我来说似乎更好。这个答案以肮脏的方式解决了这个问题。


您正在滥用glutPostRedisplay,如this answer中所述。问题是,glutPostRedisplay标记当前窗口需要重新显示,但只有在您再次进入glutMainLoop后才会执行。这确实只发生一次,因此只有一次睡眠似乎有效。

事实上,所有三个睡眠都有效,但300毫秒后你只能重画一次。

要解决此问题,您必须找到另一种重绘场景的方法。

while(i--){
    x_pos += 3;
    sleep(100);
    yourDrawFunction();
}

假设您正在使用UNIX系统。

  

睡眠100毫秒

sleep(100);

这里的问题是,你正在睡觉100秒,因为你可能正在使用<unistd.h>标题的睡眠功能,它将sleep()定义为:

extern unsigned int sleep (unsigned int __seconds);

你想要的可能是

usleep(100000); //sleeps for 100000 microseconds == 100 ms

答案 1 :(得分:3)

我相信你的代码的问题是你的睡眠正在弄乱过剩的主循环。调用堆栈可能看起来像这样

main() -> glutMainLoop() -> keyPress() -> sleep()

#but can't get to this...
main() -> glutMainLoop() -> display()

keyPress()返回之前,过剩的主循环无法继续渲染下一帧。它等待函数返回。 所有glutPostRedisplay()都会说&#34; 嘿,某些内容已经更改,因此图片已过时,我们需要在下次主循环迭代时重绘&# 34; 即可。它实际上并没有调用display()

您必须构建代码,以便主循环可以正常继续,但仍然需要在绘制之间延迟。例如:

  • keyPress()中,设置moving = true州。让函数返回。
  • idle()功能中,如果正在移动,或者如果您上次移动,请致电sleep()(实际上您可能需要考虑计算已用时间并进行计时)你自己,所以你不要阻止整个程序)
  • 再次在idle()增加x_pos并减少你的移动次数,让函数返回,过剩,然后再次调用空闲,你可以再次睡眠/移动。