gpt4 book ai didi

C++ 时间测量看起来太慢

转载 作者:可可西里 更新时间:2023-11-01 18:26:11 24 4
gpt4 key购买 nike

我正在使用 OpenGL GLUT 代码编写游戏,我正在应用一种游戏开发技术,该技术包括测量游戏主循环每次迭代所消耗的时间,因此您可以使用它来按比例更新游戏场景上次更新了。为了实现这一点,我在循环开始时有这个:

void logicLoop () {

float finalTime = (float) clock() / CLOCKS_PER_SEC;
float deltaTime = finalTime - initialTime;
initialTime = finalTime;

...
// Here I move things using deltaTime value
...
}

当我向游戏中添加一颗子弹时,问题就来了。如果子弹在两秒内没有击中任何目标,则必须将其摧毁。然后,我所做的就是保留对子弹创建时刻的引用,如下所示:

class Bullet: public GameObject {

float birthday;

public:
Bullet () {
...
// Some initialization staff
...

birthday = (float) clock() / CLOCKS_PER_SEC;
}

float getBirthday () { return birthday; }

}

然后我将其添加到 finalTime 和 deltaTime 测量之外的逻辑中:

if (bullet != NULL) {
if (finalTime - bullet->getBirthday() > 2) {
world.remove(bullet);
bullet = NULL;
}
}

它看起来不错,但是当我运行代码时,子弹存活的时间太长了。为了寻找问题所在,我打印了 (finalTime - bullet->getBirthday()) 的值,我发现它增加得非常非常慢,就像它不是以秒为单位的时间一样。

问题出在哪里?我以为结果会在几秒钟内完成,所以子弹会在两秒钟内取出。

最佳答案

这是一个常见的错误。 clock() 不测量实际时间的流逝;它测量 CPU 运行此特定进程时经过了多少时间。

其他进程也占用CPU时间,所以两个时钟不一样。每当您的操作系统正在执行其他进程的代码时,包括当这个进程“休眠”时,都不算作 clock()。如果您的程序在具有多个 CPU 的系统上是多线程的,clock() 可能会“重复计算”时间!

人类对操作系统时间片一无所知或感知:我们只是感知实际时间的实际流逝(称为“挂钟时间”)。最终,您将看到 clock() 的时基与挂钟时间不同。

Do not use clock() to measure wall time!

您需要像 gettimeofday()clock_gettime() 这样的东西。为了减轻人们改变系统时间的影响,在 Linux 上我个人推荐使用系统的“单调时钟”的 clock_gettime(),一个与墙上时间同步但具有任意纪元的时钟不受人们玩弄计算机时间设置的影响。 (如果需要,显然可以切换到可移植替代方案。)

这实际上是在 the cppreference.com page for clock() 上讨论的:

std::clock time may advance faster or slower than the wall clock, depending on the execution resources given to the program by the operating system. For example, if the CPU is shared by other processes, std::clock time may advance slower than wall clock. On the other hand, if the current process is multithreaded and more than one execution core is available, std::clock time may advance faster than wall clock.

当您不确定正在发生什么时,请养成阅读您使用的所有功能的文档的习惯。

编辑:原来 GLUT 本身有一个函数可以用于此目的,这可能很方便。 glutGet(GLUT_ELAPSED_TIME) 为您提供自调用 glutInit() 以来经过的毫秒数。所以我想这就是你在这里需要的。它的性能可能会稍微好一点,特别是如果 GLUT(或 OpenGL 的其他部分)已经在周期性地请求 wall time,并且如果这个函数只是查询已经获得的时间……从而使您免于不必要的第二次系统调用(这会产生成本) .

关于C++ 时间测量看起来太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43745361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com