所以在我的游戏中,我需要以独立于硬件的方式模拟物理。
我将使用固定的时间步模拟,但我需要能够计算在两次调用之间传递的时间。
我试过这个并且无处可去:
#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);
}
谢谢!
答案 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)