Мой любимый способ сделать это - настроить повторяющийся таймер с использованием SDL_AddTimer с функцией обратного вызова, которая отправляет пользовательское событие в очередь событий каждые 20 миллисекунд. Всякий раз, когда ваш цикл событий сталкивается с этим событием, обновляйте позицию спрайта и перерисовывайте эту часть экрана (нарисуйте фон поверх спрайта и нарисуйте спрайт в новом месте).
Приятно, если вы делаете это таким образом, что даже если вы временно отстаете в обновлении экрана, внутреннее представление спрайта все равно будет течь регулярно. Это важно, если вы выполняете какое-либо обнаружение столкновений, когда спрайт, внезапно перепрыгивающий половину экрана, может позволить ему пройти сквозь стену, которая должна была его заблокировать.