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,添加经过时间的主要内容,如果未能解决你的问题,请参考以下文章