2014-02-22 39 views
2

我想知道SDL 2.0中是否有幀速率上限?如果是這樣,那麼如何修改默認上限?SDL 2.0中內置了幀速率上限嗎?

我使用C++和SDL 2.0創建遊戲引擎。當我在屏幕上顯示作爲渲染文本的幀速率時,顯示的結果不斷在每秒58幀和62幀之間波動。

這似乎很奇怪,我爲我再怎麼多的圖像呈現在屏幕上,或有多少邏輯代碼的工作,我投入一個週期,顯示的幀速率保持每秒58至62幀之內。

這裏是我正在計算幀速率:

// FPS 
//Record the current system ticks 
mSystemTicksCurrent = Timer::GetSystemTicks(); 

//Calculate the time it takes for a single cycle to run 
mSingleCycle = mSystemTicksCurrent - mSystemTicksPrevious; 

//to prevent division by zero... 
if(mSingleCycle != 0) 
{ 
    mFPS = 1000.0f/mSingleCycle; 
} 
//...indicate that a miniscule amount of time has elapsed, thus leading to an extremely fast frame rate 
else 
{ 
    mFPS = 9999.9f; 
} 


//Since we are done calculating the time it has taken for a single cycle to elapse, 
//record the time that was used to calculate the elapsed cycle time for future use. 
mSystemTicksPrevious = mSystemTicksCurrent; 

,現在我把計算出的幀速率和它呈現在屏幕上:

if(mpTimerFPS != nullptr) 
{ 
    if(mpTimerFPSText != nullptr) 
    { 
     sprintf_s(mTimerFPSTextBuff, "FPS: %.1f", mFPS); 
     mpTimerFPSText->SetTexture(Window::UpdateText(mTimerFPSTextBuff, mpTimerFPSFont, mTimerFPSColor)); 
    } 
} 

當定時器:: GetSystemTicks( )功能簡單如下:

Uint32 Timer::GetSystemTicks() 
{ 
    return timeGetTime(); 
} 

如果需要,我可以提供更多的代碼。

+0

我不知道是肯定的,但我會想象SDL被設置爲不提供任何超過屏幕的刷新率(通常爲60Hz)的速度更快。以更快的速度顯示的點是什麼?如果你想爲其他東西(例如物理)加快速度,那麼在一個單獨的線程上循環運行它。 –

+0

'timeGetTime()'不準確。它在Windows上的精確度通常在16毫秒左右,這將會導致62 FPS。 –

+2

您是否使用SDL_RENDERER_PRESENTVSYNC標誌創建了渲染器? https://wiki.libsdl.org/SDL_RendererFlags?highlight=%28%5CbCategoryEnum%5Cb%29%7C%28SDLEnumTemplate%29 – olevegard

回答

7

經過測試您的回覆之後,我確定它確實是渲染器受屏幕刷新率的限制,因爲我在創建渲染器時使用了SDL_RENDERER_PRESENTVSYNC標誌。 下面的代碼行是什麼限制了幀率:

mpRenderer.reset(SDL_CreateRenderer(mpWindow.get(), -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC)); 

即使我刪除SDL_RENDERER_ACCELERATED標誌,幀率保持在任何顯示器設定在刷新。 我測試,並通過改變我的顯示器的刷新率成75Hz而不是60Hz的和我的測試證明了這一點增加到74-77幀。 那一刻我刪除了SDL_RENDERER_PRESENTVSYNC標誌,幀速率焰火。

作爲一個方面說明:我測試了這個使用timeGetTime()以及其他滴答計數獲取功能,並且所有返回相同的結果。

參考SDL_CreateRenderer()https://wiki.libsdl.org/SDL_CreateRenderer