SDL 增量时间重置
SDL delta time reset
我使用 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;
这两个语句没有相互结合使用;但它表明问题在于我需要一种重置或 'restart' 计时器的方法。我无法更改 currentTime 中的值,因为 SDL_GetTicks() 不应如此操作。
如何重置增量时间?
您可能会从阅读有关游戏循环的内容中获益。下面这篇文章很有用。
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);
}
}
我使用 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;
这两个语句没有相互结合使用;但它表明问题在于我需要一种重置或 'restart' 计时器的方法。我无法更改 currentTime 中的值,因为 SDL_GetTicks() 不应如此操作。
如何重置增量时间?
您可能会从阅读有关游戏循环的内容中获益。下面这篇文章很有用。
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);
}
}