2010-04-20 62 views
1

只需查看分解每秒幀數的資源即可。我知道這跟跟蹤Ticks有關,並找出每幀之間有多少個刻度。但我從來沒有遇到任何資源,爲什麼你必須使用你使用的方法才能獲得順利的框架工作。我試圖對此有所瞭解。任何可以解釋或提供任何好的資源?由於瞭解FPS及其使用方法

回答

3

基本上有兩種方法。

在ActionScript(和許多其他引擎)中,您請求播放器以特定的幀率調用某個函數。對於Flash遊戲,您將幀速率設置爲30 FPS,然後您將實現一個偵聽ENTER_FRAME事件的函數來執行您需要執行的操作。這意味着您每幀大約需要33毫秒(1000ms/30FPS = 33.33ms /幀)。如果你的代碼響應ENTER_FRAME需要超過33毫秒,你會得到一些口吃。

在home-rolled主循環中(例如,您通常在C++/SDL中執行的操作),請儘可能快地運行主循環。這意味着每幀之間的時間將是可變的。你仍然需要保持幀代碼的「膽量」小於33毫秒,以確保你至少可以獲得30 FPS,但是如果不是很多事情發生,你的遊戲運行速度將會超過30 FPS。爲了解決這個問題,您需要按照自上一幀以來經過的時間對所有邏輯進行編程,並放棄使用幀本身作爲時間單位。

+1

你能舉一個編程的例子:「根據從上一幀開始經過的時間,並放棄使用幀本身作爲一個時間單元」,你的邏輯? – Shawn 2011-04-28 20:13:10

0

對於連續可變的幀速率,您可以測量最後一幀所用的時間並假設這個幀將花費相同的時間長度。這具有意義上的好處,即時間或多或少地持續運行。這種方法最大的問題是VSync的遊戲完全有可能從60 fps變爲30 fps,並在後續幀中再次變回。從經驗來看,解決這個問題的一個好方法是平均最後幾幀時間。這使結果平滑。在60到30 fps切換時,每幀將假定1/45秒進行,因此60幀每秒運行緩慢,並且30幀每秒幀快速運行,並且感知速度保持在45fps。

更好的是不要在你的計算中使用這種時間步驟。設置自己的最低FPS ...說10fps。然後以1/10秒的間隔計算所有遊戲邏輯。渲染引擎然後知道對象在哪裏以及它正在朝哪裏前進,因此可以對對象位置進行內插/外推,直到其下一個「決定」框出現。這具有許多優點。它將您的邏輯完全從渲染中分離出來。它允許您將邏輯計算分散在多個幀中。例如,在60Hz下,如果每隔6幀保持一個邏輯對象的路徑,就可以測試一個邏輯對象在哪個點上與世界相關。這可以讓您在不同的幀上處理一些邏輯對象以在整個時間內傳播計算負載。其最大的缺點是,如果幀速率降到目標速率以下,所有速度都會減慢。