驯服glutTimerFunc

时间:2016-02-03 11:13:09

标签: c opengl glut

我使用的是 GLUT计时器功能,这个场景比教程和常见问题解答中的内容稍微复杂一些。简化摘要如下:

如果符合 条件 ,则必须在短时间内及时重新绘制屏幕。如果条件不满足,则意味着重新显示由其他机制控制,因此定时器功能不应该通过重复已经完成的工作而保持不变。因为它不能 取消注册 ,它是否必须以编程方式减速并超出目的?以下代码段是否是在 C

中实现它的正确方法
#define SLOW 1000
#define FAST 100
GLboolean condition = GL_FALSE

//   {   …   } //mechanism for setting the condition

void update (int val)
{
if(val)glutPostRedisplay();
return;
}

void timerCallback(int par)
{
if(condition == GL_TRUE){
  update(1);
  glutTimerFunc(FAST, timerCB, FAST); 
  }else {
  glutTimerFunc(SLOW, timerCB, SLOW);
  }
return;
}

提前致谢!

1 个答案:

答案 0 :(得分:3)

condition为false时,您可以简单地避免注册回调,而不是让它运行得更慢。来自glutTimerFunc文档:

  

与大多数其他回调不同,定时器只出现一次。

然后,当condition再次成为真时,从将condition设置为true的代码注册回调。注意不要重新注册已经安排的回调 - 你应该保留另一个标志,告诉回调当前是否已注册,因为文档说“你不能取消注册定时器回调”。

代码示例:

GLboolean isCallbackRegistered = GL_FALSE;

void timerCallback(int par)
{
  if(condition == GL_TRUE){
    update(1);
    glutTimerFunc(FAST, timerCB, FAST); 
  } else {
    isCallbackRegistered = GL_FALSE;
  }
}

// ... the code the changes the value of `condition`
condition = GL_TRUE;
if(isCallbackRegistered != GL_TRUE) {
  isCallbackRegistered = GL_TRUE;
  glutTimerFunc(FAST, timerCB, FAST); 
}