0

我试图通过使用 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 函数放在多个位置,但我似乎找不到它们的最佳位置(鉴于我的代码甚至是正确的)。

4

3 回答 3

4

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

编辑:或更可能它应该进入您的空闲功能。自从我使用 glut 已经有一段时间了。

于 2012-07-11T19:59:49.067 回答
0

glutMainLoop()

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

于 2012-07-11T20:04:18.533 回答
0

在您初始化的那一刻,您next_game_tickelapsed_time没有初始化elapsed_time

于 2012-07-11T20:04:33.000 回答