我有一个游戏引擎作为课程的一部分工作.目前,它的渲染依赖于帧速率,一个要求是转向基于计时器的依赖.我不知道如何确定它依赖于帧速率的位置.我不知道该找什么.我意识到我需要以某种方式合并一个计时器(GetTickCount?)来实现这一目标,但我不确定更新频率的频率.
我不打算交代码,可能只是一些有用的指导方针?
想象一下,你有一个非常简单的游戏,它只是一个球在屏幕上移动.如果没有基于时间的更新,它会在您更新时移动得更快.
你想要做的是找出多少时间已经过去当更新的,而不是像这样,(在一小部分,我通常衡量秒,所以物理方程匹配更好.):
ballPosition += ballVelocity
Run Code Online (Sandbox Code Playgroud)
你有这个:
ballPosition += ballVelocity * timeElapsed
Run Code Online (Sandbox Code Playgroud)
这意味着,对于更高的帧速率,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();
}
Run Code Online (Sandbox Code Playgroud)
为了得到时间,GetTickCount应该工作.您可能还需要考虑QueryPerformanceCounter更高的精度,尽管它可能存在多个内核的问题.