0

我以为我跳过了一个水坑,结果却掉进了大海:/

我正在尝试实现一个 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 给了我比我需要的更多的分辨率。最多可以应用毫秒。

不管我的分辨率需求如何,我都尝试过宋浩的方法:

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 时间 - 而不是挂墙时间。

如上所述,GLUT_ELAPSED_TIME 效果很好,除了我无法在程序中途重置它,而且我的 5 秒不再依赖于我最初的按钮单击。

如果您能提供一些建议,我将非常感激即使是朝着正确的方向轻推。非常感谢您提前。

-克罗普克

4

1 回答 1

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;

}
于 2012-07-17T19:35:42.107 回答