opengl中递归函数内的时间延迟

时间:2015-12-03 04:55:34

标签: c++ opengl freeglut

我的问题是我的功能如此迅速地完成工作,以至于我看不到屏幕上的进度,这是我的显示功能:

 void showMaze(const Maze::Maze &m){

 glPushMatrix();
 glTranslatef(-1,1, 0);

 for(int i=0;i<m.num_Y;i++) 
   {
 for(int j=0;j<m.num_X;j++)  
     {

char c = m.maze[i][j]; 

if(c=='1'){   glColor3f(255,255,0);
            glRectf(0.05, -0.05, -0.05,0.05);
        }
if(c=='0'){   glColor3f(20,60,60);
            glRectf(0.05, -0.05, -0.05,0.05);
        } 
 glTranslatef(0.1,0, 0);
  }
     glTranslatef(-(m.num_X*0.1),-0.1, 0);
  }
  glPopMatrix();
  } 

递归函数:

    bool findPath(Maze* M, char m){  

    showMaze(*M);
    glutPostRedisplay();

        if(M->isFinish())   
            return true;

        if (m!='s' && M->north()){
            update(M, 'n');
            if(isNew(M) && findPath(M, 'n') && M->isFinish()){  
                return true;
            }
            else{       
                M->south();
            }
        }
        // ..... 
            else{
            return false;
        }
    }
  void render()
 {
 glClear( GL_COLOR_BUFFER_BIT );
      findPath(N,'z');
 glutSwapBuffers();
 }

主要:

   glutDisplayFunc( render );

所以我的问题是我怎样才能等待几秒钟(以便我可以看到进展)每当调用findpath时,我已经尝试过glutimeelapsed,sleep,gettickcount但是没有正确的工作。

EDIT1: 当我在调用showMaze()之后立即调用sleep()之类的东西时,几秒钟内都没有显示任何内容,然后最后的屏幕显示,我不是c ++的专家,但我认为首先应该执行showMaze(),然后是睡眠( )函数,或c ++等待执行整个函数来显示结果? EDIT2: 我找到了问题的解决方案,每当他们改变时,我将X和Y带到迷宫中,并将其存储在两个向量中,并且在我的绘图功能中,我显示fisrt空迷宫,然后我慢慢添加更改的X和Y. / p>

1 个答案:

答案 0 :(得分:1)

除非您通过交换缓冲区显示正在渲染的内容,否则屏幕上将不会显示任何内容(除非您要渲染到前端缓冲区,但这样做是不确定的)。因此,您可以在递归函数的中间长时间睡觉,但在退出该callstack之前,您不会看到任何内容。到那时,你已经吸引了所有人。

因此,当您希望某些内容可见时,您需要在递归调用堆栈中使用glutSwapBuffers,而不是仅仅是睡觉。

然而,这是一个坏主意。 render调用不应该像睡眠一样。系统需要您的render实际渲染,因为屏幕可能需要更新,原因有很多(另一个窗口会显示更多窗口等)。您不应该像这样暂停render循环。

相反,你应该做的是每个渲染循环执行一个段,依靠glutPostRedisplay来确保循环不断被调用。你应该将动画基于循环执行之间的时间差,或者你应该使用睡眠定时器来确保至少X时间总是在循环之间传递。

因此,您需要将递归调用展开为迭代过程。

或者,如果您可以访问Boost.Context或Boost.Coroutine,则可以使用它来处理事情。这样,你可以保持你的递归结构。当您渲染了要显示的所有内容时,只需将协程暂停回render,后者将交换缓冲区并返回。