OS独立C库用于计算时间间隔?

时间:2010-06-04 20:40:46

标签: c time

所以在我的游戏中,我需要以独立于硬件的方式模拟物理。

我将使用固定的时间步模拟,但我需要能够计算在两次调用之间传递的时间。

我试过这个并且无处可去:

#include <time.h>
double time_elapsed;
clock_t last_clocks = clock();
while (true) {
  time_elapsed = ( (double) (clock() - last_clocks) / CLOCKS_PER_SEC);
  last_clocks = clock();
  printf("%f\n", time_elapsed);
}

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用gettimeofday获取秒数加上自纪元以来的微秒数。如果你想要秒数,你可以这样做:

#include <sys/time.h>
float getTime()
{
    struct timeval time;
    gettimeofday(&time, 0);
    return (float)time.tv_sec + 0.000001 * (float)time.tv_usec;
}

我最初误解了你的问题,但你可能会发现以下方法可以使固定时间步的物理循环变得有用。

制作固定时间步的物理循环需要做两件事。

首先,您需要计算从现在到上次运行物理的时间。

last = getTime();
while (running)
{
    now = getTime();
    // Do other game stuff
    simulatePhysics(now - last);
    last = now;
}

然后,在物理模拟中,您需要计算固定的时间步长。

void simulatePhysics(float dt)
{
    static float timeStepRemainder; // fractional timestep from last loop
    dt += timeStepRemainder * SIZE_OF_TIMESTEP;

    float desiredTimeSteps = dt / SIZE_OF_TIMESTEP;
    int nSteps = floorf(desiredTimeSteps); // need integer # of timesteps

    timeStepRemainder = desiredTimeSteps - nSteps;

    for (int i = 0; i < nSteps; i++)
        doPhysics(SIZE_OF_TIMESTEP);

}

使用这种方法,您可以通过计算自上次物理运行以来模拟的正确时间步数,同时保持实际物理(在我的示例中为doPhysics)固定时间步长,同时保持实时和游戏时间之间的同步

答案 1 :(得分:0)