关于C#:在OpenGL中先后暂停
Pausing in OpenGL successively
|
1
2 3 4 5 6 7 8 9 10 11 12 |
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 方向执行平移。在每一步之间,程序应该hibernate 100 毫秒。
-
我们要移动一个机器人,并在他前进的时候连续停顿。
-
我们在使程序在 3 个步骤之间hibernate时遇到了问题。上面的代码片段有什么问题?
相关讨论
- "我们在使程序hibernate时遇到问题" 会发生什么,您希望会发生什么?
- 我们希望翻译一个机器人并hibernate 100 毫秒,然后再次移动它并再次hibernate。连续睡眠不起作用。只有一个睡眠有效。
我相信你的代码的问题是你的睡眠弄乱了 glut 的主循环。调用堆栈可能看起来像这样
|
1
2 3 4 |
main() -> glutMainLoop() -> keyPress() -> sleep()
#but can't get to this... |
直到
您必须对代码进行结构化,以使主循环可以正常继续,但在绘图之间仍存在延迟。例如:
-
在
keyPress() 中,设置一个moving = true 状态。让函数返回。 -
在
idle() 函数中,如果移动或者如果您上次移动过,则调用sleep() (实际上,您可能想考虑计算经过的时间并自己进行计时,这样您就不会阻塞整个程序) -
再次在
idle() 中增加x_pos 并减少你的移动计数,让函数返回,过剩将绘制,然后再次调用空闲,你可以再次睡眠/移动。
免责声明:jozxyqk 的答案对我来说似乎更好。这个答案以一种肮脏的方式解决了这个问题。
您正在滥用
事实上所有三个睡眠都可以工作,但是在 300 毫秒后你只能重绘一次。
要解决这个问题,你必须找到另一种重绘场景的方法。
|
1
2 3 4 5 |
while(i--){
x_pos += 3; sleep(100); yourDrawFunction(); } |
假设您在 UNIX 系统上工作。
sleep for 100 ms
|
1
|
sleep(100);
|
这里的问题是,您正在睡眠 100 秒,因为您可能正在使用
|
1
|
extern unsigned int sleep (unsigned int __seconds);
|
你想要的可能类似于
|
1
|
usleep(100000); //sleeps for 100000 microseconds == 100 ms
|
相关讨论
- 这个答案也适用于 Windows。
sleep 不是sleep 。 - 为绘图添加另一个循环或入口点违反了标准的渲染循环实践。它可能有效,但它是一个黑客。例如。您在此睡眠期间丢失了事件处理,并且某些 gl 框架(例如 webgl)不提供显式交换缓冲区。