我有一个游戏引擎可以作为类(class)的一部分。当前,其渲染取决于帧速率,并且一项要求是移至基于计时器的依赖。我不确定如何确定它所依赖的帧速率。我不确定要寻找什么。我意识到我将需要以某种方式合并一个计时器(GetTickCount?)来完成此操作,但是我也不知道要多久更新一次。

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

最佳答案

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

您想要做的是找出已经花费了多少时间(一小部分。我通常以秒为单位进行测量,因此物理方程式更匹配。)更新时,而不是像这样:

ballPosition += ballVelocity

您将拥有:
ballPosition += ballVelocity * timeElapsed

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

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

我通常将timeElapsed作为参数传递给任何与时间相关的函数。这样做的好处是,您可以通过将经过的时间乘以一个值来减慢或加快游戏的速度。您也可以将其应用于单个组件。如果改用帧限制模型,它也可以很好地发挥作用,因为您实际上只是在将GetTickCount强制为常数。伪代码:
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();
}

为了获得时间, QueryPerformanceCounter 应该可以工作。您还可以查看 ojit_code 以获得更高的精度,尽管它可能会在多个内核中出现问题。

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

10-09 01:18