我正在 linux 机器上用 C 自学 openGL。这是我使用循环绘制圆的基本代码。我想减慢这个程序的执行速度,以便我可以逐点查看圆的形成。 (希望我能够正确传达我的意思)。
#include <GL/glut.h> // Header File For The GLUT Library
#include<math.h>
void main (int argc, char*argv[])
{
float y, x=-0.75;
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_RGBA | GLUT_DEPTH);
glutInitWindowPosition(200,150);
glutInitWindowSize(500,500);
glutCreateWindow (argv[0]);
glClearColor (0.0, 0.0, 0.0, 0.0); // choosing the background color
glClear (GL_COLOR_BUFFER_BIT); // setting the color buffer to background color
glColor3f(1,1,1);
glPointSize(2);
for (x=-0.75;x <= 0.75; x=x+0.005){
y = sqrt(0.5625 -(x*x));
glBegin(GL_POINTS);
glVertex2f(x,y);
glVertex2f(x,-y);
glEnd();
}
glFlush();
glutMainLoop();
}
最佳答案
您的循环,执行绘图命令可能会在窗口尚未放置在屏幕上时同时运行。作为一般规则,您应该始终从绘图处理程序而不是其他任何地方进行绘制。
关于您“放慢”进程的请求。您可以使用 usleep为了那个原因。但是,这也会使您的程序在执行绘图时无响应。
此外,重要 OpenGL 使用异步操作模型,即所有绘图操作都排队,只有在刷新队列后才执行。因此,要以明确定义的时间查看绘图进度,您必须等待上一步完成。为此使用 glFinish
。
最后但同样重要的是,要真正看到发生的进展,您必须绘制到(双缓冲窗口的)前台缓冲区或使用单缓冲窗口。现在有一个问题:如果您正在使用合成窗口管理器,则窗口的内容更新可能会延迟到执行缓冲区交换之前。当然,这不会发生在单个缓冲窗口上。这实际上意味着合成和单缓冲绘图不能很好地混合。
实现这一点的唯一真正可靠的方法不是延迟绘图本身,而是在通常的动画循环中一次又一次地重绘整个场景。然后在每次迭代后一步终止绘图过程。
关于c - 如何减慢C中代码的执行速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19351658/