8. 固定时间步长(Fixed Time Step)

3D Computer Graphics Programming

Posted by Pavel on December 27, 2024

iShot_2024-06-02_00.19.58.gif

SDL_Delay与Busy-Waiting方法

目的:实现固定时间步长,使每帧的更新时间间隔保持一致。

Busy-Waiting(忙等)

void update(void) {
    while (!SDL_TICKS_PASSED(SDL_GetTicks(), previous_frame_time + FRAME_TARGET_TIME));

    previous_frame_time = SDL_GetTicks();
}

Busy-Wating(忙等)的定义:程序通过一个while循环不停地检查当前时间与目标时间的差异,以确定是否达到了帧目标时间。

效率问题:这种方法会占用大量CPU资源,因为它在等待的过程中没有进行任何有用的工作,只是不断地循环检查时间。

SDL_Delay

//Wait some time util the reach the target frame time in milliseconds
int time_to_wait = FRAME_TARGET_TIME - (SDL_GetTicks() - previous_frame_time);

//Only delay execution if we are running too fast
if (time_to_wait > 0 && time_to_wait <= FRAME_TARGET_TIME)
{
    SDL_Delay(time_to_wait);
}

previous_frame_time = SDL_GetTicks();

当等待时间大于0且小于等于目标时间,调用SDL_Delay函数进行延迟。这种方法的优势是SDL_Delay会让出CPU的控制权,使得CPU可以执行其他任务而不是在忙等中浪费资源。