Jai*_*mc2 8 c++ opengl time glut game-physics
我正在使用OpenGL GLUT代码编写游戏,并且我正在应用游戏开发技术,该技术包括测量游戏主循环的每次迭代所消耗的时间,因此您可以使用它来按比例更新游戏场景.已更新.为实现这一点,我在循环开始时有这个:
void logicLoop () {
float finalTime = (float) clock() / CLOCKS_PER_SEC;
float deltaTime = finalTime - initialTime;
initialTime = finalTime;
...
// Here I move things using deltaTime value
...
}
Run Code Online (Sandbox Code Playgroud)
当我在游戏中添加子弹时,问题出现了.如果子弹在两秒内没有击中任何目标,则必须将其销毁.然后,我做的是保持对子弹创建的时刻的引用:
class Bullet: public GameObject {
float birthday;
public:
Bullet () {
...
// Some initialization staff
...
birthday = (float) clock() / CLOCKS_PER_SEC;
}
float getBirthday () { return birthday; }
}
Run Code Online (Sandbox Code Playgroud)
然后我将其添加到finalTime和deltaTime测量之外的逻辑中:
if (bullet != NULL) {
if (finalTime - bullet->getBirthday() > 2) {
world.remove(bullet);
bullet = NULL;
}
}
Run Code Online (Sandbox Code Playgroud)
它看起来很不错,但是当我运行代码时,子弹会保留太多时间.寻找问题,我打印了(finalTime - bullet-> getBirthday())的值,我看到它增加的确非常慢,就像它不是以秒为单位测量的时间.
问题出在哪儿?我虽然结果将是几秒钟,所以子弹将在两秒钟内被移除.
Lig*_*ica 10
这是一个常见的错误.clock()不衡量实际时间的流逝; 它测量CPU运行此特定进程时经过的时间.
其他进程也占用CPU时间,因此两个时钟不一样.每当您的操作系统正在执行某些其他进程的代码时,包括这个代码正在"休眠"时,都不会计入clock().如果您的程序在具有多个CPU的系统上是多线程的,则clock()可能会"重复计算"时间!
人类对OS时间片没有任何了解或感知:我们只是感知实际时间的实际通过(称为"壁时间").最终,你会看到clock()时间基准与时间不同.
你要像gettimeofday()或clock_gettime()代替.为了减轻人们改变系统时间的影响,在Linux上我个人推荐clock_gettime()使用系统的"单调时钟",一个与壁挂时间同步的时钟,但有一个任意的时代不受人们玩电脑的时间设置的影响.(如果需要,显然可以转用便携式替代品.)
这实际上在cppreference.com页面clock()上讨论过:
std::clock时间可以比挂钟更快或更慢地进行,这取决于操作系统给予程序的执行资源.例如,如果CPU由其他进程共享,则std::clock时间可能比挂钟慢.另一方面,如果当前进程是多线程的并且有多个执行核心可用,则std::clock时间可能比挂钟更快.
当您不确定发生了什么时,请养成阅读您使用的所有功能的文档的习惯.
编辑:结果GLUT本身有一个你可以使用的功能,这可能很方便.glutGet(GLUT_ELAPSED_TIME)为您提供自拨打电话以来经过的墙毫秒数glutInit().所以我想这就是你需要的.它可能稍微高一些,特别是如果GLUT(或OpenGL的其他部分)已经定期请求挂起时间,并且此函数仅查询已经获得的时间...从而使您免于不必要的第二次系统调用(成本) .
| 归档时间: |
|
| 查看次数: |
708 次 |
| 最近记录: |