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);
    }
}