假设一个角色在游戏中跳跃需要一秒钟,如果 FPS 为 10fps、30fps、100fps 等,游戏开发人员将如何将跳跃时间保持在 1 秒?- 如果你得到我,你将如何阻止游戏的 fps 影响游戏速度。
我想有某种方法可以做到这一点,所以我想知道它到底是什么?
谢谢,亚历克斯!
假设一个角色在游戏中跳跃需要一秒钟,如果 FPS 为 10fps、30fps、100fps 等,游戏开发人员将如何将跳跃时间保持在 1 秒?- 如果你得到我,你将如何阻止游戏的 fps 影响游戏速度。
我想有某种方法可以做到这一点,所以我想知道它到底是什么?
谢谢,亚历克斯!
通常通过使用计时器来记录自上一帧渲染以来经过了多少时间。Google 上有很多关于该主题的文章和示例:
当然,如果你的 FPS 被允许是任何东西,那么你最终会得到不切实际的模拟。出于这个原因,存在“固定时间步长”的概念。
“修复你的时间步长!” (以及该页面上链接的以前的文章)尤其是关于这个主题的好读物。
一个大主题的简短回答
我想你的游戏应该放置“动画”而不是由它的帧序列号决定,而是由参考的时间延迟决定......
1)示例:1 秒跳跃,只有 3 幅绘图......应该考虑draw#1 a t0 draw#2 if t+0.25 and t+0.75 and draw#3 if between t+0.75 and t+1
2) 示例:如果您的移动/动画由诸如 positionX(int RelativeFrameNumber) 之类的公式确定你应该考虑通过使用像 positionX(long relativeTimeInMillisecond) 这样的时间来改变你的功能
或在您的游戏循环中进行微小更改
3)在您的循环中放置一个“等待”代码,该代码根据连续/固定计算的帧速率性能进行校准
希望有所帮助
许多物理引擎在某种 update() 方法中传递一个增量时间。
void update(float dt)
此增量值表示与固定帧速率(例如 60fps)成比例的当前帧步长。例如,如果 dt 是 1.0,那么我们就是 60fps,如果 dt 是 2.0,那么我们就是 30fps,如果 dt 是 0.5,那么我们就是 120fps.. 等等。
要在任何帧速率下以相同的速度移动(在您的情况下是跳跃)角色,请将 dt 乘以对象的速度向量以保持角色以相同的速度跳跃。
void update(float dt)
{
myChar.Vel += myChar.Direction.Normalized() * myChar.Speed * dt;
//myChar.Speed is in meters per second
}
注意:二次物理需要不同的计算。