SDL增量时间重置

时间:2015-03-27 13:47:00

标签: c++ time sdl

我使用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()。

如何重置增量时间?

1 个答案:

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