Hello I have been reading this article https://gafferongames.com/post/fix_your_timestep/ about the timestep. I have managed to put it in the game but sprites are stuttering sometimes and I have no idea how to fix it. Here is how my code look like:
The OnFixedUpdate that you see is integrate from that article and deltatime variable is set to 1 / 30:
EDIT: I have put deltatime variable to 1/60 and now its rarely stuttering. Is that normal?
//Update Scripts
m_Registry.view<NativeScriptComponent>().each([=](auto entity, auto& nsc)
{
if (!nsc.Instance) {
nsc.Instance = nsc.InstantiateScript();
nsc.Instance->m_GameObject = GameObject{ entity, this };
nsc.Instance->camera = orthoCamera;
nsc.Instance->OnCreate();
} else{
nsc.Instance->OnUpdate(dt);
}
});
///Physics update
playerPrevious.pos = playerCurrent.pos = &player->GetComponent<Rigidbody2DComponent>().Position;
playerPrevious.vel = playerCurrent.vel = &player->GetComponent<Rigidbody2DComponent>().Velocity;
if(dt > 0.25f)
dt = 0.25f;
accumulator += dt;
while(accumulator >= deltatime) {
playerPrevious = playerCurrent;
controllerPrevious = controllerCurrent;
OnFixedUpdate(playerCurrent, 1, deltatime);
accumulator -= deltatime;
}
const double alpha = accumulator/deltatime;
player->GetComponent<Rigidbody2DComponent>().Position.x = playerCurrent.pos->x * alpha + playerPrevious.pos->x * (1.0 - alpha);
player->GetComponent<Rigidbody2DComponent>().Position.y = playerCurrent.pos->y * alpha + playerPrevious.pos->y * (1.0 - alpha);
player->GetComponent<Rigidbody2DComponent>().Velocity.x = playerCurrent.vel->x * alpha + playerPrevious.vel->x * (1.0 - alpha);
player->GetComponent<Rigidbody2DComponent>().Velocity.y = playerCurrent.vel->y * alpha + playerPrevious.vel->y * (1.0 - alpha);
//Dont make player fall down the map
if(player->GetComponent<SpriteComponent>().Position.y < 10.0f)
{
player->GetComponent<Rigidbody2DComponent>().Velocity.y = 0.0f;
player->GetComponent<Rigidbody2DComponent>().Position.y = 10.0f;
player->GetComponent<SpriteComponent>().Position.y = 10.0f;
}
//////////////////////////////////////////////////////////////////
//Rendering
auto view = m_Registry.view<SpriteComponent>();
renderer->Begin();
for(auto entity : view) {
auto &sprite = view.get<SpriteComponent>(entity);
renderer->DrawCubeTextured(sprite.Position, sprite.Size, *sprite.Sprite, sprite.color, sprite.texCoords);
}
renderer->End();