opengl中递归函数内部的时间延迟
time delay inside recursive function in 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 时,我如何才能等待几秒钟(以便我可以看到进度),我已经尝试过 glutimeeelapsed、sleep、gettickcount,但是 none 完成了这项工作正确。
编辑1:
当我在调用 showMaze() 之后立即放置类似 sleep() 的东西时,几秒钟没有显示任何内容,然后显示最终屏幕,我不是 C++ 专家,但我想应该先执行 showMaze(),然后再执行 sleep( ) 函数,或 c++ 等待执行整个函数以显示结果?
编辑2:
我找到了解决问题的方法,每当 X 和 Y 发生变化时,我都会将它们从迷宫中取出,并将其存储在两个向量中,在我的绘图功能中,我首先显示空迷宫,然后我慢慢添加改变的 X 和 Y。
除非您通过交换缓冲区来显示正在渲染的内容,否则屏幕上不会显示任何内容(除非您正在渲染到前台缓冲区,但这是不确定的)。因此,您可以在递归函数中间休眠多长时间,但在退出该调用堆栈之前,您不会看到任何东西。到那时,你已经画完了所有东西。
因此,当您希望某些内容可见时,您需要在递归调用堆栈中使用 glutSwapBuffers
,而不仅仅是休眠。
但是,这是个坏主意。 render
调用不应该做睡眠之类的事情。系统需要您的 render
才能实际呈现,因为屏幕可能需要因各种原因而更新(另一个 window 显示更多您的 window,等等)。你不应该让你的 render
循环像这样自行暂停。
相反,您应该做的是在每次渲染循环执行时执行一段,依靠 glutPostRedisplay
来确保循环不断被调用。并且您应该将动画基于循环执行之间的时间增量,或者您应该使用睡眠计时器来确保至少 X 时间总是在循环之间经过。
因此您需要将递归调用展开为迭代过程。
或者,如果您有权访问 Boost.Context 或 Boost.Coroutine,则可以使用它来处理事情。这样,您可以保留递归结构。当你渲染完你想要显示的所有内容时,你只需将你的协程挂起回到 render
,谁将交换缓冲区和 return.
我的问题是我的功能完成工作太快以至于我在屏幕上看不到进度,这是我的显示功能:
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 时,我如何才能等待几秒钟(以便我可以看到进度),我已经尝试过 glutimeeelapsed、sleep、gettickcount,但是 none 完成了这项工作正确。
编辑1: 当我在调用 showMaze() 之后立即放置类似 sleep() 的东西时,几秒钟没有显示任何内容,然后显示最终屏幕,我不是 C++ 专家,但我想应该先执行 showMaze(),然后再执行 sleep( ) 函数,或 c++ 等待执行整个函数以显示结果? 编辑2: 我找到了解决问题的方法,每当 X 和 Y 发生变化时,我都会将它们从迷宫中取出,并将其存储在两个向量中,在我的绘图功能中,我首先显示空迷宫,然后我慢慢添加改变的 X 和 Y。
除非您通过交换缓冲区来显示正在渲染的内容,否则屏幕上不会显示任何内容(除非您正在渲染到前台缓冲区,但这是不确定的)。因此,您可以在递归函数中间休眠多长时间,但在退出该调用堆栈之前,您不会看到任何东西。到那时,你已经画完了所有东西。
因此,当您希望某些内容可见时,您需要在递归调用堆栈中使用 glutSwapBuffers
,而不仅仅是休眠。
但是,这是个坏主意。 render
调用不应该做睡眠之类的事情。系统需要您的 render
才能实际呈现,因为屏幕可能需要因各种原因而更新(另一个 window 显示更多您的 window,等等)。你不应该让你的 render
循环像这样自行暂停。
相反,您应该做的是在每次渲染循环执行时执行一段,依靠 glutPostRedisplay
来确保循环不断被调用。并且您应该将动画基于循环执行之间的时间增量,或者您应该使用睡眠计时器来确保至少 X 时间总是在循环之间经过。
因此您需要将递归调用展开为迭代过程。
或者,如果您有权访问 Boost.Context 或 Boost.Coroutine,则可以使用它来处理事情。这样,您可以保留递归结构。当你渲染完你想要显示的所有内容时,你只需将你的协程挂起回到 render
,谁将交换缓冲区和 return.