使用gettimeofday夹紧FPS

时间:2012-07-11 19:56:52

标签: c++ macos opengl

我正试图通过使用gettimeofday将我的游戏循环限制到特定的FPS。这是一个非常简陋的游戏,所以它不断咀嚼我所有的处理能力。

无论我设置FRAMES_PER_SECOND有多低,它都会继续尝试尽快运行。

我对deWiTTERS关于游戏循环的说法有了很好的处理,但我使用的是gettimeofday而不是GetTickCount b / c我在Mac上。

另外,我正在运行OSX并使用C ++,GLUT。

这就是我的主要观点:

int main (int argc, char **argv)
{
    while (true)
    {
    timeval t1, t2;
    double elapsedTime;
    gettimeofday(&t1, NULL); // start timer

    const int FRAMES_PER_SECOND = 30;
    const int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;
    double next_game_tick = elapsedTime;
    int sleep_time = 0;

    glutInit (&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize (windowWidth, windowHeight); 
    glutInitWindowPosition (100, 100);
    glutCreateWindow ("A basic OpenGL Window"); 
    glutDisplayFunc (display); 
    glutIdleFunc (idle); 
    glutReshapeFunc (reshape);
    glutPassiveMotionFunc(mouseMovement); //check for mouse movement
    glutMouseFunc(buttonPress); //check for button press

    gettimeofday(&t2, NULL); // stop timer after one full loop
    elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;      // compute sec to ms
    elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;   // compute us to ms

    next_game_tick += SKIP_TICKS;
    sleep_time = next_game_tick - elapsedTime;
    if( sleep_time >= 0 )
        {
        sleep( sleep_time );
        }

    glutMainLoop (); 
    }
}

我尝试将我的gettimeofday和sleep函数放在多个位置,但我似乎无法找到它们的最佳位置(假设我的代码甚至是正确的)。

3 个答案:

答案 0 :(得分:4)

只会被召唤一次。您需要将FPS逻辑放在我认为的显示函数中,因为glutMainLoop永远不会返回。 (这也意味着你的while循环不需要。)

编辑:或者更有可能它应该进入你的空闲功能。自从我使用过剩以来已经有一段时间了。

答案 1 :(得分:0)

glutMainLoop()

  

glutMainLoop进入GLUT事件处理循环。 此例程最多应在GLUT程序中调用一次。一旦调用,此例程将永远不会返回。它将根据需要调用已注册的任何回调。

答案 2 :(得分:0)

next_game_tick初始化elapsed_time时,您尚未初始化elapsed_time