Java DeltaTime与转换问题
我有一个简单的游戏引擎;在游戏循环中,我有一个deltaTime变量。从最后一帧开始的时间,以秒为单位,deltaTime变量与我所期望的完全相同Java DeltaTime与转换问题,java,game-engine,game-physics,Java,Game Engine,Game Physics,我有一个简单的游戏引擎;在游戏循环中,我有一个deltaTime变量。从最后一帧开始的时间,以秒为单位,deltaTime变量与我所期望的完全相同 然而,即使deltaTime很好,我也无法准确地变换实体的位置。它在非常低的FPS下运行良好,但在与它混了一段时间后,当它变得更高15时,我发现了答案: 我有上次循环通过后的增量时间,而不是上次物理更新。 如果有人在乎,答案是: while(running){ long now = System.nanoTime();
然而,即使deltaTime很好,我也无法准确地变换实体的位置。它在非常低的FPS下运行良好,但在与它混了一段时间后,当它变得更高15时,我发现了答案: 我有上次循环通过后的增量时间,而不是上次物理更新。 如果有人在乎,答案是:
while(running){
long now = System.nanoTime();
//HERE IS WHERE THE DELTA TIME CODE WAS LAST
tickDelta += (now - lastTime) / nsPerTick;
frameDelta += (now - lastTime) / nsPerFrame;
lastTime=now;
if(tickDelta>=1){
//THIS IS WHERE IT SHOULD BE
//GETS THE TIME SINCE LAST TICK
deltaTime= (now - deltaTimeTimer) / 1000000000f;
deltaTimeTimer=now;
ticks++; Tick(); tickDelta=0;
}
if(frameDelta>=1){frames++; Render(); frameDelta=0;}
if(System.currentTimeMillis() - Timer >= 1){Timer+=1000; System.out.println("FPS: "+frames+"; TPS: "+ticks +"; deltaTime: "+deltaTime); ticks=0;frames=0;}
try{Thread.sleep(5);} catch(Exception err){} //TODO: Remove
//System.out.println(deltaTime);
}
}
是否可以将增量时间的值存储在内存中,并在最后打印出来,以查看它们是否与FPS匹配?也就是说,在每秒钟50帧的速度下,deltaTime在20毫秒左右徘徊。@JoseMartinez是的,我已经试过了。我使用sleep方法暂停循环,发现deltaTime变量返回的结果与我预期的完全一致。此外,deltaTime以秒为单位;因此,如果curEntity.pos.y很大,curEntity.velocity.y和deltaTime都很小,那么我可以每秒做1*deltaTime 1,可能精度不够。那么curEntity.pos.y的值将保持不变。请参阅添加大数字和小数字一节。为什么要暂停?这将使你的观察无效。保持deltaTime为Nano,它将正确运行,我打赌。@Fildor我所做的是让循环进入睡眠状态。因此,如果我让循环进入睡眠状态1秒,deltaTime返回1预期如果我让它进入睡眠状态半秒,它返回。5预期
long now = System.nanoTime();
deltaTime= (now - lastTime) / 1000000000f;
lastTime=now;
while(running){
long now = System.nanoTime();
//HERE IS WHERE THE DELTA TIME CODE WAS LAST
tickDelta += (now - lastTime) / nsPerTick;
frameDelta += (now - lastTime) / nsPerFrame;
lastTime=now;
if(tickDelta>=1){
//THIS IS WHERE IT SHOULD BE
//GETS THE TIME SINCE LAST TICK
deltaTime= (now - deltaTimeTimer) / 1000000000f;
deltaTimeTimer=now;
ticks++; Tick(); tickDelta=0;
}
if(frameDelta>=1){frames++; Render(); frameDelta=0;}
if(System.currentTimeMillis() - Timer >= 1){Timer+=1000; System.out.println("FPS: "+frames+"; TPS: "+ticks +"; deltaTime: "+deltaTime); ticks=0;frames=0;}
try{Thread.sleep(5);} catch(Exception err){} //TODO: Remove
//System.out.println(deltaTime);
}
}