【发布时间】:2015-01-26 06:01:19
【问题描述】:
我有一个(简单的)游戏引擎;在游戏循环中我有一个“deltaTime”变量。 (自上一帧以来的时间,以秒为单位) deltaTime 变量与 id 期望的完全一样。
但是,即使 deltaTime 很好,我也无法准确地转换实体的位置。它在非常低的 FPS 下工作正常,但随着它变得更高(15
我在这里找到了疑似问题代码区:
curEntity.pos.y+= curEntity.velocity.y * deltaTime;
pos.y、velocity.y 和 deltaTime 都是浮点数。
这是怎么回事?我该如何解决这个问题?
如果您有兴趣,这里是获取 deltaTime 的代码:
long now = System.nanoTime();
deltaTime= (now - lastTime) / 1000000000f;
lastTime=now;
// 值得注意的是,我正在尝试做 Unity 所做的事情; 另外,我尝试将 pos.y、velocity.y 和 deltaTime 更改为双打
【问题讨论】:
-
是否可以将增量时间的值存储在内存中并在最后打印出来以查看它们是否与 FPS 匹配?也就是说,在 50 FPS 时,deltaTime 徘徊在 20 毫秒左右。
-
@JoseMartinez 是的,我已经尝试过了。我使用了一种 sleep 方法来停止循环,并发现 deltaTime 变量完全按照我的预期返回。此外,deltaTime 以秒为单位;所以我可以做 1*deltaTime(每秒 1 个)
-
如果
curEntity.pos.y很大,而curEntity.velocity.y和deltaTime都很小,您可能会用完精度。然后curEntity.pos.y的值将保持不变。请参阅添加大号和小号here 部分。 -
你为什么拖延它?这将使您的观察无效。我敢打赌,将 deltaTime 保持在 nanos 中,它会正确运行。
-
@Fildor 我所做的是将循环置于睡眠状态。因此,如果我将循环置于睡眠状态 1 秒,如果我将其置于睡眠状态半秒,则 deltTime 返回 1(预期) ,它返回 0.5(预期)
标签: java game-engine game-physics