gpt4 book ai didi

c++ - 使程序基于计时器而不是帧率依赖?

转载 作者:行者123 更新时间:2023-11-30 01:00:57 25 4
gpt4 key购买 nike

作为类(class)的一部分,我有一个游戏引擎可以使用。目前,它的渲染依赖于帧率,一个要求是转向基于计时器的依赖性。我不确定如何确定它依赖于帧速率的位置。我不确定要寻找什么。我意识到我需要以某种方式合并一个计时器(GetTickCount?)来完成此操作,但我也不确定更新它的频率。

我不希望获得代码,可能只是一些有用的指南?

最佳答案

假设您有一个非常简单的游戏,它只是一个在屏幕上移动的球。没有基于时间的更新,它的移动速度与您的更新速度一样快。

你想要做的是找出已经过去了多少时间(分数。我通常以秒为单位测量,所以物理方程更匹配。)更新时,而不是像这样:

ballPosition += ballVelocity

你会有这个:

ballPosition += ballVelocity * timeElapsed

这意味着对于更高的帧速率,timeElapsed 将更低,因此球移动得更少。较低的帧速率意味着 timeElapsed 会更大,并且球每帧移动得更多。

最终,球将移动相同的距离,而与帧速率无关。 60 FPS 的更新速率使 timeElapsed 等于 0.01666667f,而 30 FPS 的更新速率将使 0.03333333f。您可以看到在 60 FPS 时,耗时是 30 FPS 的一半,但因为它快两倍,所以是相同的数字。

我通常将 timeElapsed 作为参数传递给任何时间相关的函数。这样做的一个很好的结果是您可以通过将耗时乘以一个值来减慢或加快您的游戏。您还可以将其应用于单个组件。如果您改用帧限制模型,它也能很好地发挥作用,因为您实际上只是在强制 timeElapsed 成为常量。伪代码:

while (gameRunning)
{
const float timeElapsed =
timer.elapsed(); // elapsed returns the number of seconds
// passed since it was last called

// GlobalTimeScale is 1 for normal time
game.update(timeElapsed * GlobalTimeScale);
game.draw();
}

要获取时间,GetTickCount应该管用。您也可以看看 QueryPerformanceCounter以获得更高的精度,尽管它可能存在多核问题。

关于c++ - 使程序基于计时器而不是帧率依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1743966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com