c - 如何减慢C中代码的执行速度?

标签 c linux opengl

我正在 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/

相关文章:

c - linux同进程下的线程如何分配stack或内存

c - 在C中通过标记读取字符串标记

.net - 如何停止 .NET Telemetry 以停止在 Ubuntu Linux 中收集数据

OpenGL 规范规定 `GLint` 必须是 32 位宽,但 gl.xml 天真地将其定义为 `int` 而不是 `int32_t` 。为什么?

java - JOGL(Java OGL)有空闲回调函数吗?

c - 如何在共享库中使用别名变量?

c - 反向 C 字符串 - 简单的错误

c - 如何确定 C 中 Linux 上给定文件的安装路径?

python - 以 DAG 方式调度作业

c++ - C++ 和 OpenGL 矩阵顺序之间的混淆(行优先 vs 列优先)