5

假设一个角色在游戏中跳跃需要一秒钟,如果 FPS 为 10fps、30fps、100fps 等,游戏开发人员将如何将跳跃时间保持在 1 秒?- 如果你得到我,你将如何阻止游戏的 fps 影响游戏速度。

我想有某种方法可以做到这一点,所以我想知道它到底是什么?

谢谢,亚历克斯!

4

3 回答 3

7

通常通过使用计时器来记录自上一帧渲染以来经过了多少时间。Google 上有很多关于该主题的文章和示例:

当然,如果你的 FPS 被允许是任何东西,那么你最终会得到不切实际的模拟。出于这个原因,存在“固定时间步长”的概念。

“修复你的时间步长!” (以及该页面上链接的以前的文章)尤其是关于这个主题的好读物。

于 2011-08-22T09:46:29.817 回答
1

一个大主题的简短回答
我想你的游戏应该放置“动画”而不是由它的帧序列号决定,而是由参考的时间延迟决定......

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)在您的循环中放置一个“等待”代码,该代码根据连续/固定计算的帧速率性能进行校准

希望有所帮助

于 2011-08-22T09:45:04.143 回答
0

许多物理引擎在某种 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    
}

注意:二次物理需要不同的计算。

于 2018-10-31T16:04:27.310 回答