2011-09-21 39 views
1

我在遊戲循環中實現了增量時間,因此幀速率的任何波動都不再重要,但是在較快的機器上游戲仍然不會跑得快,而在慢速機器上跑得慢呢?固定的遊戲更新週期

我的印象是,大多數遊戲以固定的速度更新邏輯(每秒60次),然後儘可能多地渲染渲染。我如何每秒鐘更新循環次數?

+0

這將更適合http://gamedev.stackexchange.com/ – JJJ

回答

1

只需使用累加器......每當遊戲循環運行時,+ =經過的時間的增量。一旦這個時間大於16.6666667秒,運行你的更新邏輯,並從你的時間減去60秒。繼續運行更新方法,直到累加器爲< 60秒:-)

僞代碼!

const float updateFrequency = 16.6666667f; 
float accumulator = updateFrequency; 

public void GameLoop(float delta) 
{ 
    // this gets called as fast as the CPU will allow. 
    // assuming delta is milliseconds 
    if (accumulator >= updateFrequency) 
    { 
     while (accumulator >= updateFrequency) 
     { 
      Update(); 
      accumulator -= updateFrequency; 
     } 
    } 

    // you can call this as many times as you want 
    Draw(); 

    accumulator += delta; 
} 

這種技術意味着,如果繪製方法花費的時間比更新頻率更長,它將迎頭趕上。當然,你必須小心,因爲如果你的抽籤方法通常需要超過1/60秒,那麼你會遇到麻煩,因爲你必須在抽籤之間多次調用更新,這可能會導致在渲染中打嗝。

+0

謝謝您的回覆,但166.666667數字來自哪裏? – SirYakalot

+1

166.666 ...毫秒== 1/60秒。 – JJJ

+1

感謝您的幫助。雖然實際上六分之一秒是16.666 ...不是嗎? – SirYakalot