OpenGL 中递归函数内部的时间延迟



我的问题是我的函数完成工作的速度如此之快,以至于我在屏幕上看不到进度,这是我的显示函数:

 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,但没有一个正确地完成工作。

编辑1:当我在调用 showMaze(( 后立即放置类似 sleep(( 的东西时,几秒钟内什么都没有显示,然后最后的屏幕显示,我不是 C++ 专家,但我想应该先执行 showMaze((,然后是 sleep(( 函数,还是 C++ 等待执行整个函数以显示结果?编辑2:我找到了解决问题的方法,每当 X 和 Y 发生变化时,我都会将 X 和 Y o 用于迷宫,并将其存储在两个向量中,在我的绘图函数中,我首先显示空迷宫,然后我慢慢添加更改的 X 和 Y。

除非您通过交换缓冲区来显示要渲染的内容,否则屏幕上不会显示任何内容(除非您要渲染到前端缓冲区,但这很不稳定(。因此,您可以在递归函数的中间睡多久,但在退出该调用堆栈之前,您不会看到任何内容。到那时,你已经画了所有东西。

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

但是,这是一个坏主意。render调用不应执行睡眠等操作。系统需要您的render才能实际呈现,因为出于各种原因(另一个窗口显示更多窗口等(可能需要更新屏幕。您不应该像这样让render循环挂起。

相反,你应该做的是每次渲染循环执行一个段,依靠glutPostRedisplay来确保循环不断被调用。并且,您应该根据循环执行之间的时间增量来制作动画,或者应该使用睡眠计时器来确保在循环之间始终至少经过 X 个时间。

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

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

最新更新