2015-06-28 99 views
0

在双缓冲区和预定帧速率下绘制一条线我想用两个缓冲区编写一个程序,并在控制台中显示每秒30帧的帧速率。我使用的Open GL - C++Open GL

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); 
    } 
+0

Just ...在Display()的顶部调用'drawScene()'。 – genpfault

回答

0

glutTimerFunc(1000/30 , mytimer, 0);告诉过剩 “从现在起,请致电mytimer每1000/30毫秒”。您可能想从main中调用它。否则GLUT将不知道你已经写了一个定时器功能。

0

第一步。

你的代码中有这条代码吗?

glutIdleFunc(idle); 

如果是,则转到idle()方法并评论里面的所有内容。你需要强制glutIdleFunc()不做任何事情。通常情况下,你有这样的:

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

由于回调(glutIdleFunc)调用闲置()每次如果有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); 
}