2011-03-10 114 views
1

所以我明白,要獲得幀率獨立運動,我必須乘以(1000/delta)的基本速度。它適用於表示速度的值,但是當我使用加速度變量嘗試時,例如重力,它不會工作,它甚至不是幀速率獨立。幀率獨立加速度

是否有加速度變量的不同公式,或者我忘記了其他東西?

實施例:

var Multiplier:Number = (GetDeltaTime())/(1000/30); 
jumpVelocity = -21 * Multiplier //works 
gravity = 1.5 * Multiplier //dosn't work 

這就是所謂的在每幀

編輯的開始:實測值的溶液中,我不得不方增量時間。不是100%確定它爲什麼有效,但確實如此。

所以:

jumpVelocity = -21 * Multiplier //unchanged 
gravity = 1.5 * Math.pow(Multiplier,2) //works now 
+1

我對動作一無所知,但我知道物理,這對我來說毫無意義。你知道單位嗎?你能給我們一些數字,並告訴我們出了什麼問題(不只是「它不會工作」)? – Beta 2011-03-10 17:28:26

+0

單位是像素/ 30秒。基本上,除加速度,重力和摩擦外,一切都可以工作。所有這些都會改變速度,而不是座標。在更高的幀速率下,這些值似乎增加(例如更快的加速度,更高的重力)。 – lordSimon 2011-03-11 04:30:03

回答

2

基本上你想要做的是測量自上一幀(即「幀時間」)已經過去的時間,並添加到累加器。

您然後向前「固定的時間的步驟」(第二的例如1 /第30次)和減去模擬時間從蓄壓器,直至它低於一個時間步您的遊戲的狀態。

因此,作爲一個例子:

  • 累加器開始於設定爲33ms

  • 1幀0

  • 固定時間步長通過在20fps的,幀時間爲1000毫秒/ 20 = 50毫秒

  • 50ms添加到累加器
  • 遊戲狀態由1個固定時間步長(33ms)轉發,該時間從累加器
  • 累加器現在是17MS,它小於一個固定時間步長 - >遊戲狀態完成更新
  • 繼續下一幀

  • 1幀通過在10fps的,幀時間1000毫秒/ 10值爲100ms

  • 100毫秒添加到累加器
  • 累加器現在117ms
  • 遊戲狀態是通過1個固定的時間步長(爲33ms)轉發,該時間是從累加器
  • 減去現在
  • 累加器是84ms,這是一個以上的固定時間步長 - >未完成的遊戲狀態更新
  • 遊戲狀態是通過1個固定的時間步長(爲33ms)轉發,該時間是從累加器減去
  • 累加器是現在51ms,這是一個以上的固定時間步 - >遊戲狀態沒有更新
  • 遊戲狀態由1個固定時間步長(33ms)轉發,該時間從累加器中減去
  • 累加器現在是18ms,它小於一個固定的時間步 - >遊戲狀態更新完成
  • 繼續下一幀

Glenn Fiedler就這個問題寫了一篇很好的文章。你可以找到它here

+0

感謝您的幫助,但我之前曾閱讀過這篇文章。我決定不使用它,因爲正如本文的最後一節所述,每幀可能會採取不同的步驟,使其變得不穩定。文章提供了一個解決方案,但我正在使用閃存,它會太慢。 – lordSimon 2011-03-11 04:51:07

+1

@simon要澄清:具有固定時間步長物理的整個想法是它看起來不像波濤洶涌。事實上,如果您更進一步並插入狀態(本文最後提到),您將在任何遊戲中,任何模擬中隨時隨地獲得最平穩,最佳的結果。也許[這個鏈接](http://www.gamepoetry.com/blog/2008/04/11/frame-based-code-sucks/)會有所幫助。看看這兩個示例swfs,製作了「基於框架的案例研究」和「基於計時器的案例研究」,並告訴我哪些看起來不穩定:) – 2011-03-11 12:36:32