osx / c ++ /过剩,增加经过的时间

时间:2012-07-17 18:59:33

标签: c++ macos glut

我以为我是在跳过一个水坑,而是倒入了海洋:/

我正在尝试实现5秒计时器(不需要超过毫秒)。

我的目标:

// I start the program in gamestate 0...
{
    if (button_has_been_pressed == 1)
    {
        gamestate = 1;
    }

}

if (gamestate==1)
{
    //wait for 5 seconds and go to gamestate2
    gamestate = 2;

}

我尝试了以下内容:

  1. GLUT_TIME_ELAPSED测量从程序开始的时间。进入gamestate1后,我无法'重置'GLUT_TIME_ELAPSED。否则,它会很有效。

  2. gettimeofday给了我比我需要的更多的分辨率。最多可以使用毫秒。

  3. 无论我的解决方案需求如何,我都试过宋浩的方法:

    gamestate1_elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;      // sec to ms
    gamestate1_elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;   // us to ms
    
    // add that elapsed time together, and keep track of its total
    
    //r_gamestate1_elapsedTime_total = gamestate1_elapsedTime;
    //if (r_gamestate1_elapsedTime_total > 5 seconds) ...
    

    但是,gamestate1_elapsedTime似乎有一些变化。因为输出很少一致。我想这是b / c gettimeofday使用CPU时间(?),我用fps钳夹人为地夹住它。

    1. 我也尝试过clock(),但这似乎也是CPU时间 - 而不是壁垒时间。
    2. 如上所述,GLUT_ELAPSED_TIME运行良好,但我无法在程序中途重置它,而我的5秒钟不再依赖于我的初始按钮点击。

      如果你能提出一些建议,我会非常感谢你们朝着正确的方向努力。非常感谢你提前。

      -kropcke

1 个答案:

答案 0 :(得分:0)

您无需“重置”GLUT_ELAPSED_TIME,只需将其复制到可用作偏移的位置即可。例如:

int timeAtReset = glutGet(GLUT_ELAPSED_TIME);

// I start the program in gamestate 0...
{
    if (button_has_been_pressed == 1)
    {
        gamestate = 1;
        timeAtReset = glutGet(GLUT_ELAPSED_TIME);
    }

}

if (gamestate==1)
{
    int timeSinceReset = glutGet(GLUT_ELAPSED_TIME) - timeAtReset;
    // use timeSinceReset, instead of glutGet(GLUT_ELAPSED_TIME), to
    // wait for 5 seconds and go to gamestate2
    gamestate = 2;

}