c++ - opengl中递归函数内部的时间延迟

标签 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,但都没有正确完成工作。

编辑1: 当我在调用 showMaze() 之后立即放置类似 sleep() 的东西时,几秒钟没有显示任何内容,然后显示最终屏幕,我不是 C++ 专家,但我想应该先执行 showMaze(),然后再执行 sleep( ) 函数,或 c++ 等待执行整个函数以显示结果? 编辑2: 我找到了这个问题的解决方案,每当 X 和 Y 发生变化时,我都会将它们从迷宫中取出,并将其存储在两个 vector 中,在我的绘图功能中,我首先显示空迷宫,然后我慢慢添加改变的 X 和 Y。

最佳答案

除非您通过交换缓冲区来显示正在渲染的内容,否则屏幕上不会显示任何内容(除非您正在渲染到前台缓冲区,但这是不确定的)。因此,您可以在递归函数中间休眠多长时间,但在退出该调用堆栈之前,您不会看到任何东西。到那时,您已经绘制了所有内容。

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

但是,这是个坏主意。 render 调用不应该做 sleep 之类的事情。系统需要您的 render 才能实际呈现,因为屏幕可能需要因各种原因(另一个窗口显示更多窗口等)而更新。您不应该让您的 render 循环像这样自行暂停。

相反,您应该做的是在每次渲染循环执行时执行一段,依靠 glutPostRedisplay 确保循环不断被调用。并且您应该将动画基于循环执行之间的时间增量,或者您应该使用 sleep 计时器来确保至少 X 时间总是在循环之间经过。

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

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

关于c++ - opengl中递归函数内部的时间延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34058155/

相关文章:

c++ - 每个解决方案一个版本的 nuget 包(但不是最新的)

c++ - 将字符添加到 char*[] 时遇到问题

java - LWJGL 渲染无任何内容

c++ - 如何在 OpenGL 即时模式下永久绘制东西?

c++ - CMake + freeglut3 : cannot find usbhid. h

c++ - 包含文件的定义

opengl - 如何知道特定设备上的最大缓冲区存储大小(使用 OpenGL)?

c - GLSL统一 float 未正确传递

c++ - 跨 Linux 发行版编译时的 OpenGL 问题

c++ - Microsoft Visual C++ - 编译一个没有依赖关系的 DLL