我的游戏使用d = vt计算对象的移动,其中t是自最后一帧以来的时间(每个循环一帧)。
我正在使用SDL,时序计算的要点是我创建了一个Timer类的实例并启动它。我在需要时调用GetSeconds(),它返回计时器启动时和当前时间之间的差值(除以1000,因为所有内容都是以毫秒为单位)。
例如:
return (SDL_GetTicks() - m_StartingTicks) / MILLISECONDS_PER_SECOND;
每次循环后,定时器复位。即m_StartingTicks = SDL_GetTicks()
但是,我最近对此进行了更改,以便仅重置if m_StartingTicks is < SDL_GetTicks
,但它无法解决问题。
直到我最近编写了一个游戏引擎来处理不同的游戏状态和我在主游戏循环中使用的各种其他东西之前,这都是笨拙的。这会严重改善性能,但不幸的是,游戏循环的每次迭代现在都在不到1毫秒内发生,因此当我传递GetSeconds()时,返回0并且屏幕上的内容不会移动。
处理此问题的最简单方法是使用简单的kludge,如果SDL_GetTicks() - m_StartingTicks) == 0
我将其更改为1(如1毫秒而不是0)。我不是很喜欢这个,我想听听任何建议,修正,改进等等。
如果您需要更多信息,我很乐意提供。
答案 0 :(得分:2)
你应该以固定的速度累积时间并更新你的游戏循环。有关详细信息,请查看此article。
答案 1 :(得分:0)
如果你以60Hz运行,那么每帧应该大约是16ms。听起来你已经禁用了垂直同步?
答案 2 :(得分:0)
听起来你的计时器代码错了。如果一帧确实在不到1毫秒内发生并且向下舍入到零,那就没问题,因为最终随着时间的增加将达到1毫秒,你会看到移动,以适当的速率平均。听起来你正试图测量帧的持续时间而不是测量自最后一帧中相同点以来的时间,如果大部分时间实际上花费在更新函数之外(例如,在vsync机制)。
听起来你可能有四舍五入的问题 - 显示你正在使用的数据类型。将一个小整数除以1000往往会使其变为零,并且您将丢失其中的任何数据,即使它之前是999。通常最好在进行分割之前将其投射到浮子上。