在Open GL中使用双缓冲区和预先确定的帧速率绘制一条线

Draw a Line with double buffer and pre-determined frame rate in Open GL

本文关键字:帧速率 绘制 一条 GL Open 双缓冲区      更新时间:2023-10-16

我想写一个有两个缓冲区的程序,并在控制台中显示每秒30帧的帧速率。我正在使用Open GL-C++

    Display()
    {
      glutSwapBuffers();
    }

fps:计时器

     void mytimer(int fps)
     {
       glutTimerFunc(1000/30 , mytimer, 0);
       glutPostRedisplay();
     }

这段代码画了一条线,但我想以每秒30帧的帧速率画一条线。

      void drawScene (void){
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_LINES);
        glVertex2f(0.0,0.0);
        glVertex2f(120.0,120.0);
        glEnd();
        glFlush();
      }
     int main (int argc ,char** argv){
       glutInit(&argc,argv);
       glutInitDisplayMode(GLUT_RGB);
       glutInitWindowSize(360,360);
       glutCreateWindow("mohammad");
       initRendering();
       mytimer(fps);
       //glutDisplayFunc(drawScene);
       glutDisplayFunc(Display);
       glutMainLoop();
       return (0);
     }

glutTimerFunc(1000/30 , mytimer, 0);告诉GLUT"从现在起,每1000/30毫秒调用一次mytimer"。您可能想从main调用它。否则GLUT将不知道您已经编写了计时器函数。

第一步。

你的代码中有这一行吗?

glutIdleFunc(idle);

如果是,请转到idle()方法并对其中的所有内容进行注释。您需要强制glutIdleFunc()什么都不做。通常你有这个:

    // executes every time if there is nothing to do basically.
void idle()
{
    glutPostRedisplay(); //draw a frame
}
// callback
glutIdleFunc(idle);

由于回调(glutIdleFunc)每次都调用idle(),如果opengl没有更好的事情可做,那么你就无法控制fps,你需要禁用它。那么,你的计时器应该工作得很好。

这是我的一段限制为每秒60帧的代码。效果很好。

    void frame_limit(int value)
{
    glutPostRedisplay();
    glutTimerFunc(1000 / 60, frame_limit, 0);
}
void idle()
{
    //glutPostRedisplay();
}

void setupCallbacks()
{
    glutCloseFunc(cleanup);
    glutDisplayFunc(display);
    glutIdleFunc(idle);
    glutTimerFunc(1000 / 60, frame_limit, 0);
}
void init(int argc, char* argv[])
{
    createShaderProgram();
    createBufferObjects();
    setupCallbacks();
}
int main(int argc, char* argv[])
{
    init(argc, argv);
    glutMainLoop();
    exit(EXIT_SUCCESS);
}