2011-04-01 12 views
13

我是新來的圖形,所以我不知道人們通常如何控制渲染事物的幀速率。 我的意思是,你如何設置你的應用程序渲染,例如30fps? 可能有很多API提供這樣的事情,但我需要從頭開始對其進行編碼。控制幀率的常用方法是什麼?

+0

可能的重複:http://stackoverflow.com/questions/2940054/how-to-determine-the-best-framerate-setinterval-delay-to-use-in-a-javascript – INS 2011-04-01 07:00:08

回答

20

「控制」幀速率有兩種「常用」方法,但都不那麼簡單。

這兩者中的第一個和更多控制,以及通常是可選的東西是VSync。這會強制顯卡在顯示器完成刷新時只推出一個新幀。許多顯示器在60赫茲時刷新,因此您傾向於獲得60 FPS。

這很適合幀率來監視刷新率,但是當幀率低於刷新時,它會被強制下一個倍數。因此,隨着幀速率開始下降一點,您會失去相當多的潛在渲染時間,因爲它會被強制爲60,然後是30,然後是20等。

(有關vsync的信息,請參閱DirectXOpenGL

常用的第二種方法(使用vsync可選地添加)不是限制幀速率。相反,請調整您的代碼以處理差異。從長遠來看,這是更加靈活的,通常更好的編碼,海事組織,並且比試圖強制特定的FPS計數要簡單得多。

假設你有一個簡單的循環渲染,它開始了尋找類似:

while (gameloop) 
{ 
    float framedelta = (timeNow - timeLast) 
    timeLast = timeNow; 

    for each (GameObject object in World) 
    { 
     object->Animate(framedelta); 
     object->Move(speed * framedelta) 
    } 

    render(); 
} 

你想看看差/時間的流逝/三角洲和工作在那裏的時間。允許幀率根據硬件和設置進行縮放(預測或處理一半的幀數有太多變化),並使您的遊戲能夠與其進行協作而不是控制它。在你的實踐中更容易,更靈活和穩定。

+1

30後來到20;) – fredoverflow 2011-04-01 09:26:37

6

產生可預測的典型方法(如果不是恆定的)幀速率(帶有視頻或3D圖形)在下面的僞代碼中描述。

算法

  1. 準備下一幀(渲染背緩衝液中);
  2. 睡眠時間片的其餘部分;
  3. 詢問要顯示的幀(交換正面和背面緩衝區)。

請注意睡眠操作的位置。它夾在同一幀的準備和顯示之間。這是恆定幀率的主要關鍵!您希望準備框架以計算總時間片以顯示幀

關於如何實現每個步驟(基於分辨率,可靠性等選擇睡眠操作),有多種變體,但核心就在那裏。

提示更高的可靠性

  • 不要爲整個區間調用你的睡眠功能一次。根據您準備接受的最大錯誤定義一些常數,並在此間隔期間重複睡眠,直到剩餘時間小於或等於此量。
  • 當您知道您無法及時準備下一幀時,不要害怕偶爾丟下一幀。它在視覺上比跳過一幀更吸引人,而不是產生可變幀頻。
  • 如果您可以避免單處理器系統上的後臺線程,請避開它​​們。使用工作線程確實會混淆睡眠功能的可靠性。最好的方法是將你的後臺工作分成小塊,並且執行這項工作而不是睡覺。

1st很容易實現,可以隱藏在輔助函數中。第二個更加棘手,因爲它需要你保持平均渲染速度的統計數據等等。第三個難以實現,因爲通常很難預測不同的任務需要多少時間。它通常僅在具有嚴格約束的實時系統中實施。

相關問題