osx/c++/glut,添加经过时间

Posted

技术标签:

【中文标题】osx/c++/glut,添加经过时间【英文标题】:osx/c++/glut, adding elapsed time 【发布时间】:2012-07-17 18:59:33 【问题描述】:

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

我正在尝试实现一个 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;


我尝试了以下方法:

    GLUT_TIME_ELAPSED 从我的程序开始测量时间。进入 gamestate1 后,我无法“重置”GLUT_TIME_ELAPSED。否则,它会很好地工作。

    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 夹人为地夹住它。

    我也尝试过 clock(),但这似乎也是 CPU 时间,而不是挂墙时间。

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

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

-克罗普克

【问题讨论】:

gettimeofday 是挂钟,而不是 CPU 时间。除非有人调整系统时间或时区,否则它是单调的,而且非常精确。如果您需要帮助,请描述您看到的“可变性”。但无论如何,GLUT_ELAPSED_TIME 似乎有一个明显的解决方案,所以我将其写下来。 另外,该值是 GLUT_ELAPSED_TIME,而不是 GLUT_TIME_ELAPSED,这意味着您发布的代码显然与您尝试过的代码不同。请参阅 sscce.org 了解您应该发布的内容。 最后,你真的想真正“等待 5 秒”(阻塞整个应用程序并以 100% 的 CPU 运行?),还是只是启动一个在 5 秒内完成某事的计时器?对于后者,glutTimerFunc(5000, functionThatSetsGameStateTo2, 0) 是显而易见的答案。 我明白了——我想我对 gettimeofday 的看法有误——谢谢你的澄清。我看到的变化是当我计算我的总时间过去的时候。我一直在跟踪毫秒,并且输出的滴答速度似乎与挂钟的速度不同。很抱歉没有复制我正在尝试的相同代码 - 我一直在迭代,以至于我面前的内容不再适用于我试图描述的内容。我现在很清楚这是一种不好的形式。我很抱歉。我已经人为地限制了我的 FPS,所以我不介意旋转受限的应用程序。字符不足:/ 我也会尝试 glutTimerFunc - 再次感谢您在下面的回答 - 感谢您的宝贵时间。 【参考方案1】:

您无需“重置”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;


【讨论】:

非常感谢您。我以前尝试过抵消它,但从来没有作为将游戏状态设置为 1 的“if”语句的一部分。你的方法现在对我来说非常清楚。再次感谢您。

以上是关于osx/c++/glut,添加经过时间的主要内容,如果未能解决你的问题,请参考以下文章

将带有 glut 的点击坐标添加到向量的链接列表中

根据使用 GLUT/OpenGL 所经过的时间移动我的相机时遇到了一个小问题

GLUT Tutorials 8: GLUT子菜单

GLUT 键盘事件

OpenGL/Glut 无法在其上绘制 [

有没有办法使用 glut 创建菜单栏? [复制]