我一直在遊戲中物體的不連貫運動中遇到一些麻煩。當幀率被限制時,對象移動波濤洶涌
如果幀速率沒有上限,遊戲運行平穩。
如果我在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。
您的意思是'm_distance + = m_speed * GetFrameTime()'? – 2010-10-15 04:54:04
哦,是的,對不起,錯字。 – random 2010-10-15 04:56:37
哈哈,我打算推薦你閱讀「fix-your-timestep」文章 – Goles 2011-03-21 19:15:26