System.currentTimeMillis可以使移动速度差别很大吗?

时间:2011-10-26 15:50:30

标签: java multithreading game-physics

有时当我玩侧挡板时,我会以正常速度移动。然而,其他时候我的角色移动得很慢。代码永远不会改变,所以我认为这个currentTimeMillis方法有问题。任何人都能解释为什么我有时会非常缓慢地移动而其他时间更快感谢。

public void run(){                              // run method for animation
        beforeTime = System.currentTimeMillis();        
        while(animationDone == false){              
            jumpCycle();                    
            timeDifference = System.currentTimeMillis() - beforeTime;
            sleepTime = 4 - timeDifference;         
            if(sleepTime < 0)       
                sleepTime = 2;              
            try{                        
                Thread.sleep(sleepTime);        
            }           
            catch(Exception e){             
            }
            beforeTime = System.currentTimeMillis();    
        }
        isJumping = isFalling = animationDone = false;
    }

编辑:对于遇到同样问题的人,我最终只使用java.util.Timer和java.util.TimerTask来实现平台无关的精度。

4 个答案:

答案 0 :(得分:2)

我在你的逻辑中看到两个问题:

(1)你假设线程只要你规定就会睡觉;实际上,这并不总是会发生:你可以“询问”2毫秒,但让线程在10毫秒后返回;你真的需要建立实际的时间睡在你的逻辑中,而不是假设你会在指定的时间内睡觉; [例如,请查看此页面上的图表,根据系统负载显示difference in requested vs actual sleep时间]

(2)你有一个任意条件,你把睡眠设置为2.为什么?如果线程实际上“落后于计划”,为什么要睡觉呢?

您可能需要考虑使用java.util.Timer类,它会为您考虑Thread.sleep()行为的各种怪癖。

答案 1 :(得分:2)

动画代码中的固有问题是你依靠时间的推移来正确地制作动画。在任何计算机系统上,由于线程调度,这是不可能的。

计算机游戏解决此问题的方法是根据自上次抽奖后经过的时间量更改动画的数量。这样,无论您的帧速率如何,动画速度都不会改变。

答案 2 :(得分:0)

从System.currentTimeMillis()的documentation开始:

  

请注意,虽然返回值的时间单位是毫秒,   值的粒度取决于底层操作   系统可能更大。例如,许多操作系统都会测量   以几十毫秒为单位的时间。

所以你不能依赖它来获得小的价值和差异。

同样,Thread.sleep

  

导致当前正在执行的线程进入休眠状态(暂时停止   执行)指定的毫秒数,受制于   系统定时器和调度程序的精度和准确度。

什么是暂停线程很短时间的好方法 - 这就是我认为你想要做的事情,恐怕我不知道。

答案 3 :(得分:0)

请尝试使用System.nanoTime(),其分辨率更高。