2014-10-26 129 views
0

我正在嘗試創建一個獨立幀速率的遊戲,其中myObject正以每毫秒一個單位向右移動。不過,我不知道如何在這段代碼計算deltaTime如何正確計算時間增量?

var currentTime = 0; 
var lastTime = 0; 
var deltaTime = 0; 

while(play) { 

    // Retrieve the current time 
    currentTime = Time.now();    
    deltaTime = currentTime - lastTime; 
    lastTime = currentTime; 

    // Move myObject at the rate of one unit per millisecond 
    myObject.x += 1 * deltaTime;  
} 

比方說,第一架用了30毫秒,所以deltaTime應該是30,但它是0 因爲我們只知道在開始的時間不在幀的末尾。然後,在第二幀花了40毫秒,所以deltaTime是30,因此myObject.x是30.但是,經過的時間是70毫秒(第一幀30毫秒+第二幀40毫秒),所以myObject.x應該是70,而不是30

我不是在模擬物理,我只是試圖將myObject相對於經過的時間(不是幀)移動。

如何正確計算deltaTime

我知道一些遊戲引擎的人使用大塊時間或打勾,所以他們提前做動畫。另外,我已經閱讀了Glenn Fiedler的article on fixing your timestep和其他很多,但我仍然感到困惑。

+0

你在用什麼語言進行編程? – APerson 2014-10-26 18:52:30

+0

這看起來像JavaScript,但這是一個語言無關的問題 – 2014-10-26 18:54:04

+0

@APerson我嘗試學習概念先生..我不打擾任何語言,只要它不會彙編 – user3578021 2014-10-26 18:55:30

回答

1

試試這個:

float LOW_LIMIT = 0.0167f;   // Keep At/Below 60fps 
float HIGH_LIMIT = 0.1f;   // Keep At/Above 10fps 

float lastTime = Time.now(); 

while(play) { 

    float currentTime = Time.now(); 
    float deltaTime = (currentTime - lastTime)/1000.0f; 
    if (deltaTime < LOW_LIMIT) 
     deltaTime = LOW_LIMIT; 
    else if (deltaTime > HIGH_LIMIT) 
     deltaTime = HIGH_LIMIT; 

    lastTime = currentTime; 

    myObject.x += 1000 * deltaTime;  // equivalent to one unit per ms (ie. 1000 per s) 
} 

有很多錯,但它可以更容易說明基本概念。

首先,請注意,在循環開始之前,您需要使用某個值初始化lastTime。您可以使用較低的值(即Time.now() - 33),以便第一幀產生所需的增量,或者像我一樣使用它(您會看到我們將其限制在循環中)。

接下來,您將獲得每個froame開始時的當前時間,並使用它計算自上次循環(在此例的第一次運行時將爲零)以來的時間。然後我喜歡將其轉換爲,因爲「每秒」工作比「每毫秒」更有意義 - 但隨時可以刪除/ 1000.0f部分以保持ms。

然後,您需要將deltaTime限制爲某個可用範圍(例如,我使用10-60fps,但您可以根據需要更改此範圍)。這只是防止循環運行太快或太慢。 HIGH_LIMIT尤其重要,因爲它可以防止可能導致遊戲循環中的混亂的非常大的delta值(最好比代碼失效時有些不準確) - LOW_LIMIT可以防止零(或非常小)的時間步長,有問題的(特別是對於物理)。

最後,一旦您計算了此幀的新的deltaTime,您將保存下一幀期間使用的當前時間。

+0

謝謝先生..爲遲到道歉..我認爲沒有1會在這裏..使用變量low_limit&high_limit給我的想法.. 在行 if(deltaTime user3578021 2014-10-29 14:31:31

+0

很高興幫助:) – free3dom 2014-10-29 18:16:20