我该如何修复我的可变速率SDL时间步长



我的游戏循环比它应该的速度快了大约10倍,我不知道如何修复它。

我尝试了多个不同的其他可变速率时间步长,但似乎没有一个像这次这样有效。

int main(int argc, char* args[])
{
Uint32 t = 0;
Uint32 dt = 10000 / 60.0;
Uint32 currentTime = SDL_GetTicks();
game = new Renderer();
game->init("window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, false);
while(game->running()){

Uint32 newTime = SDL_GetTicks();
Uint32 frameTime = newTime - currentTime;
currentTime = newTime;
while(frameTime > 0.0)
{
float deltaTime = std::min(frameTime, dt);
game->handleEvents();
game->update(deltaTime/1000);
frameTime -= deltaTime;
t += deltaTime;

t += dt;
}
game->render();
}
game->clean();
return 0;
}

每当我打

g.transform.position.x+=1/60.0;

在render函数中,我希望它每1秒移动一个像素,但它移动得太快了。有人知道我该如何放慢速度,或者我做错了什么吗?

由于在渲染方法中更新了对象,所以执行速度过快。你有一个固定和可变时间步长的组合,如果游戏的物理部分落后,它会试图赶上,但对渲染方法没有限制。(这很好(

因此,您应该在更新方法中更新游戏对象,然后将对象设置为g.transform.position.x+=deltatime(稍后可能需要另一个变量,例如:g.transform.position.x+=speed*deltatime(

game->render()中,您所要做的就是绘制对象。

这应该可以修复你的游戏循环时间。

game->render()中的不同位置渲染对象的唯一原因是,如果更新方法中有固定的时间步长,则必须在更新周期之间进行渲染。

希望这能有所帮助。