2010-10-15 75 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; 
相关问题