我在遊戲循環中實現了增量時間,因此幀速率的任何波動都不再重要,但是在較快的機器上游戲仍然不會跑得快,而在慢速機器上跑得慢呢?固定的遊戲更新週期
我的印象是,大多數遊戲以固定的速度更新邏輯(每秒60次),然後儘可能多地渲染渲染。我如何每秒鐘更新循環次數?
我在遊戲循環中實現了增量時間,因此幀速率的任何波動都不再重要,但是在較快的機器上游戲仍然不會跑得快,而在慢速機器上跑得慢呢?固定的遊戲更新週期
我的印象是,大多數遊戲以固定的速度更新邏輯(每秒60次),然後儘可能多地渲染渲染。我如何每秒鐘更新循環次數?
只需使用累加器......每當遊戲循環運行時,+ =經過的時間的增量。一旦這個時間大於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秒,那麼你會遇到麻煩,因爲你必須在抽籤之間多次調用更新,這可能會導致在渲染中打嗝。
謝謝您的回覆,但166.666667數字來自哪裏? – SirYakalot
166.666 ...毫秒== 1/60秒。 – JJJ
感謝您的幫助。雖然實際上六分之一秒是16.666 ...不是嗎? – SirYakalot
這將更適合http://gamedev.stackexchange.com/ – JJJ