我有一个游戏引擎可以作为类(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/