Java的currentTimeMillis返回负值

Mil*_*lad 2 java time

我正在用Java开发一个简单的2D游戏,一切正常.为了找到正确的FPS刷新/重绘/更新,我使用currentTimeMillis来查找差异.

问题是currentTimeMillis有时会返回负值,而Thread.sleep会抛出异常(java.lang.IllegalArgumentException:timeout值为负)

我做的是在我的游戏中放一段时间,而currentTimeMillis <= -1再次检查直到它结束,然后睡觉.

代码示例:

private void gameLoop(){
    // Find FPS
    long FPS = 40;
    long beginTime = System.currentTimeMillis();
    while(beginTime < -1){
        beginTime = System.currentTimeMillis();
    }
    while(!done){
        // Sleep
        try{ 
            beginTime += FPS;
            long currTime = System.currentTimeMillis();
            while(currTime < -1){
                currTime = System.currentTimeMillis();
            }
            difference = (beginTime - currTime);
                           // Should be (currTime - beginTime) 

            Thread.sleep(difference); 
        }catch (Exception e){ 
            e.printStackTrace();
        }
        // RENDER GAME
        renderGame();
    }
    JOptionPane.showMessageDialog(null, "Game Over\nYou Died.");
    System.exit(0);
}// end gameLoop()
Run Code Online (Sandbox Code Playgroud)

当游戏开始时,这很好,但有时我仍然得到例外.有没有更好的办法?我仍然认为它返回负值是很奇怪的.

Bri*_*new 11

真正的问题beginTime-currTime不是消极的吗?

difference = (beginTime - currTime);
Thread.sleep(difference); 
Run Code Online (Sandbox Code Playgroud)

我注意到你添加FPS(40)beginTime.但如果currentTime大于beginTime+FPS,你就会遇到问题.

如果你试图定期安排一些事情(我认为你是这样),请查看Timer,这样你就可以更简单/可靠地完成这项工作.


dfa*_*dfa 5

imho以下指示:

difference = (beginTime - currTime);
Run Code Online (Sandbox Code Playgroud)

应该:

difference = (currTime - beginTime);
Run Code Online (Sandbox Code Playgroud)

currTime总是大于beginTime,因此差异总是负数或至少为0.