2010-10-15 79 views
3

我一直在遊戲中物體的不連貫運動中遇到一些麻煩。當幀率被限制時,對象移動波濤洶涌

如果幀速率沒有上限,遊戲運行平穩。

如果我在60fps的幀速率上限,那麼移動是波動的。

一個對象的運動看起來像這樣...

m_distance += m_speed * GetFrameTime() 

如果速度是每秒像素,GetFrameTime()返回自上一幀經過的時間。請注意,對象僅在x和y方向移動。

我正在使用SFML,功能SetFramerateLimit(60)UseVerticalSync(true)。在嘗試解決波濤洶涌的移動問題時,我從XNA開發人員那裏讀到一篇關於它們如何更新一次,渲染一次,然後如果在遊戲循環中還剩下一段時間(即1/60)的幀速率的文章,我會在那段時間休息。我相信這就是SFML所做的,因爲我禁用了這些功能並寫下了這種行爲,並且我得到了相同的症狀。

現在我不是說上述方法是一件壞事。事實上,我喜歡這個應用程序沒有做不必要的工作(當運行帶有設置幀限制的應用程序時,資源使用情況有明顯不同)。但是,我真的不知道爲什麼這個運動是波濤洶涌。我已經閱讀了gafferongames的文章,但他們似乎並不適用於此。

任何幫助表示讚賞,謝謝。

編輯:我已經確定了這個問題,現在只是不知道如何解決它。

在對象「跳躍」的幀上,m_distance明顯大於其他幀中的距離。仔細觀察,GetFrameTime()也顯着大於幀之間的前一時間(重要的是像2-3毫秒的差異)。

編輯2:我相信我已經想出了一個解決方案,感謝http://gafferongames.com/game-physics/fix-your-timestep/。設置固定的增量時間而不是使用GetFrameTime。

+0

您的意思是'm_distance + = m_speed * GetFrameTime()'? – 2010-10-15 04:54:04

+0

哦,是的,對不起,錯字。 – random 2010-10-15 04:56:37

+0

哈哈,我打算推薦你閱讀「fix-your-timestep」文章 – Goles 2011-03-21 19:15:26

回答

1

的唯一原因用不完:

m_distance += m_speed * GetFrameTime(); 

是,如果你正在試圖獲得幀獨立運動。在這種情況下,沒有理由限制您的FPS。

當你有一個FPS上限,比如SFML實現時,我建議保持每幀的運動不變。也就是說,像這樣:

m_distance += m_speed; 
相關問題