【转】使用glut定时器控制帧率

写了个程序,运行很慢,帧率很低,不知道什么原因,以为程序代码太多,执行太慢,经过不断的调试和验证,才弄明白。现在记录一下:

在glut函数中:

      通过函数glutDisplayFunc(Draw);来设置需要显示的画面函数,虽然函数中有glutSwapBuffers();和glFlush();函数来刷新输出,但不会不断进行刷新。

     如果需要不断刷新,则需要进行如下设置:

     glutDisplayFunc(Draw);

     glutIdleFunc(Draw);  //增加idle时候的函数

但是这样的话,如果函数内容不多,则会刷新过快。于是要通过glut的定时器函数来控制帧率,定时进行glutPostRedisplay();

例程如下:

使用glutTimerFunc是因為我想要讓他固定每16ms更新畫面一次(FPS大約60) void main() {    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA );    glutInitWindowSize( 640,480 );    WinNumber=glutCreateWindow( "Test" );    glutDisplayFunc(display);    。。。。。。    glutTimerFunc(16, OnTimer, 1);    glutMainLoop(); } void OnTimer(int value) {    alpha++;    alpha=(alpha%256);    glutPostRedisplay();    glutTimerFunc(16, OnTimer, 1); } void display() {       ..........上略...............
     glutSwapBuffers(); }

(1)如果用定时器的话,初始的时候注册一个定时器的回调函数,原型是
glutTimerFunc(unsigned int
millis, void (*func)(int value), int value);
参数对应关系为:glutTimerFunc(毫秒数,
回调函数指针, 区别值);
(2)写自己的回调函数 void OnTimer(int
value);
用value区分是哪个定时器
(3)在函数里改变和位置有关的变量,然后调用glutPostRedisplay();用来重绘
(4)最后再次调用glutTimerFunc,因为glut的定时器是调用一次才产生一次定时,所以如果要持续产生定时的话,在定时函数末尾再次调用glutTimerFunc

原文地址:https://www.cnblogs.com/lzhitian/p/2818502.html