我一直在游戏中物体的不连贯运动中遇到一些麻烦。当帧率被限制时,对象移动波涛汹涌
如果帧速率没有上限,游戏运行平稳。
如果我在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