我使用SDL,并且我使用SDL_GetTicks()来获取增量时间,但问题出在这里:
auto currentTime = SDL_GetTicks();
float deltaTime = 0.f, lastTime = 0.f;
deltaTime = (currentTime - lastTime) / 1000.f;
lastTime = currentTime;
deltaTime以秒为单位,终端显示deltaTime的值以秒为单位。但是,我该如何重置它?问题在于,如果我有一个精灵,一个网格甚至一个在场景中移动的摄像机,事实是当deltaTime的值增加时,它的移动会加速超时。我尝试了不同的方法来重置deltaTime,但它们不会产生正确的结果:
我试过了:
if (deltaTime > 1.f)
deltaTime = 0.f; // or deltaTime -= 1.f;
if (deltaTime > (currentTime - lastTime)
deltaTime = 0.f;
这两个陈述并未相互结合使用;但它表明问题在于我需要一种方法来重置或“重启”计时器。我无法更改currentTime中的值,因为不应该操纵SDL_GetTicks()。
如何重置增量时间?
答案 0 :(得分:1)
你可能会从阅读游戏循环中受益。以下文章非常有用。
http://gafferongames.com/game-physics/fix-your-timestep/
这大致是我在SDL游戏中处理游戏循环的方式
const double FRAME_TIME = 1 / 60 // delta time for 60 FPS
double lastTime = SDL_GetTicks();
double frameCounter = 0;
double unprocessedTime = 0;
int frames = 0;
SDL_Event e;
while (isRunning)
{
while (SDL_PollEvent(&e))
{
// HANDLE EVENTS
}
bool render = false;
double startTime = SDL_GetTicks();
double passedTime = startTime - lastTime;
lastTime = startTime;
unprocessedTime += passedTime;
frameCounter += passedTime;
if (frameCounter >= 1.0)
{
printf("FPS: %i | %f ms\n", frames, 1000.0 / ((double)frames));
frames = 0;
frameCounter = 0;
}
while (unprocessedTime > FRAME_TIME)
{
Update((float)FRAME_TIME);
render = true;
unprocessedTime -= FRAME_TIME;
}
if (render)
{
Render();
frames++;
}
else
{
SDL_Delay(1);
}
}