很多人都在SDL_PollEvent和SDL_WaitEvent之間糾結。前者會帶來更好的幀數表現,但是CPU占用極大,可以直接吃掉一個核心。后者則基本不占用CPU,但是幀數會受到影響。有沒有辦法使兩者的優勢結合呢?其實只要用輪詢(SDL_PollEvent)並且配合一個幀速限制即可。
什么是幀速(FPS)?是指畫面每秒傳輸幀數。要保證畫面流暢,一般就要保持幀速在20及以上。要想限制幀速,我們只要在循環中加入如下代碼:
const Uint FPS=1000/20;//20可替換為限制的幀速 Uint32 _FPS_Timer; while (quit!=0){ //事件處理等 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幀每秒)。