Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DeltaTime与转换问题_Java_Game Engine_Game Physics - Fatal编程技术网

Java 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变量。从最后一帧开始的时间,以秒为单位,deltaTime变量与我所期望的完全相同


然而,即使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);
    }
}