很多人都在SDL_PollEvent和SDL_WaitEvent之间纠结。前者会带来更好的帧数表现,但是CPU占用极大,可以直接吃掉一个核心。后者则基本不占用CPU,但是帧数会受到影响。有没有办法使两者的优势结合呢?其实只要用轮询(SDL_PollEvent)并且配合一个帧速限制即可。

什么是帧速(FPS)?是指画面每秒传输帧数。要保证画面流畅,一般就要保持帧速在20及以上。要想限制帧速,我们只要在循环中加入如下代码:

const Uint FPS=/;//20可替换为限制的帧速
Uint32 _FPS_Timer;
while (quit!=){
//事件处理等
if(SDL_GetTicks()-_FPS_Timer<FPS){
SDL_Delay(FPS-SDL_GetTicks()+_FPS_Timer);
}
_FPS_Timer=SDL_GetTicks();
}

这个就是帧速率限制的方法。
      当我们开始传输一帧时,我们同时开始计时,跟踪显示当前帧用的时间。为了使这个程序不会运行的太快,每帧传输需要一定的时间,要求每秒显示20帧,那么每帧显示时间要不小于1/20秒。如果帧速率是60fps,每帧显示需要时间就要不小于1/60秒。例程要求是20帧每秒,也就是每帧需要耗时50毫秒。
     为了调整帧速率,我们首先要检查帧计时器的时间是否小于每帧传输所需时间。如果帧计时器时间大于每帧传输所需时间,就说明帧速率比要求的要低,这样我们就不需要进行限速调整了。如果帧计时器时间比每帧所需的时间少,那么我们就要用SDL_Delay()来进行延时,使帧速率符合要求。
     假设程序运行时,帧计时器的时间是20毫秒,那么我们就需要延时30毫秒;如果帧计时器是40毫秒,那么就要延时10毫秒(这样做的话,每帧相当于耗时50毫秒,帧传输速率就是20帧每秒)。

05-06 12:41