我在很多教程(以及书籍)中都看到,当你必须改变一个物体的位置时,你应该将移动量乘以经过的游戏时间。
我知道这是由于CPU的速度,每台PC都有所不同,所以如果你不这样做,每个玩游戏的人都会看到不同的速度。
这是真的吗?
在这种情况下我也应该这样做吗?在哪些情况下我应该这样做?
public void Update(GameTime gameTime)
{
float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
position_ += change_position_amount_ * elapsed;
scale_ += change_scale_amount_; // * elapsed; ?
color_ *= fade_amount_; // * elapsed; ?
}
答案 0 :(得分:1)
关于你的第一个问题: 是的,这是真的。如果您不在更新时使用更改时间,则不同的CPU和不同的操作条件(在后台运行大量程序)将导致更快地调用Update()。我们在那里使用deltaTime,因为它允许在更少地调用Update()方法时进行补偿。 对于你的第二个问题: 这完全取决于你。你是否认为使用你的游戏的人会因为缩放或褪色似乎跳过来而感到沮丧? 我通常会将deltaTime用于涉及移动的任何事情。
附注: 你当前如何获得经过的时间(或deltaTime)并不重要,因为它是一个浮点数。下面通常是我看到deltaTime如何使用XNA和MonoGame
float deltaTime = gameTime.ElapsedGameTime.TotalMilliseconds / 1000.0f;
基本上,上面的行以整数形式获得毫秒数,然后创建一个大小为毫秒的浮点数。这会产生一个包含秒数的浮点数,后面带有精确的小数。
答案 1 :(得分:1)
您的第一个问题的答案是是,很可能他们将以不同的速度执行。您的游戏可能会有需要处理大量信息的时间,而且可能会变慢。如果不考虑帧之间经过的时间量,更快的CPU和GPU将使游戏执行得更快。例如,如果你在CPU或GPU上编程游戏,然后其他人在非常快的CPU和GPU上进行游戏,那么游戏对他们来说可能太快(而且无与伦比)。此外,如果一个非常弱的CPU或GPU玩游戏,并且只获得20-30fps,则游戏将以半速运行,除非考虑经过的时间量。
要回答你的第二个问题,我会根据经过的时间多次依赖于时间。 (正如@SteveH指出的那样,您可以使用gameTime.ElapsedGameTime.TotalMilliseconds
或gameTime.ElapsedGameTime.Totalseconds
,以满足您的需求为准。所以:
public void Update(GameTime gameTime)
{
float elapsed = (float)gameTime.ElapsedGameTime.TotalMilliseconds;
position_ += change_position_amount_ * elapsed;
scale_ += change_scale_amount_ * elapsed;
color_ *= fade_amount_ * elapsed;
}
总而言之,如果你想要一个速度一致的游戏,你应该考虑经过的时间。
作为旁注,gameTime.ElaspedTime.TotalMilliseconds
通常不会返回确切的时间。如果您想要非常精确地使用gameTime.ElapsedRealTime.TotalMilliseconds
(XNA 3.1或更早版本)或使用时间跨度或秒表。 HTH