Java Swing Timers的速度不同

时间:2011-12-03 01:08:53

标签: java swing timer

我正在使用Java制作2D平台,而我正在使用Swing计时器,它的设置间隔为5毫秒。然而,有时它是以良好的速度运动平稳,但随后它将变得超快,有时超级慢。这可能是什么原因?

代码:

public Board() {
    addKeyListener(new KeyListener());
    setFocusable(true);
    setBackground(new Color(204,250,255));

    //draws the object off the screen in memory, then brings it in
    setDoubleBuffered(true);

    ...(other code not relevant)...

    timer = new Timer(5, this);
    timer.start();
}

public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;

    //draw platform
    for(int i = 0; i < platform.length; i++) {
        //g2d.setColor(new Color(0,0,0));
        //g2d.drawRect(platform[i].getX(), platform[i].getY(), platform[i].getWidth(), platform[i].getHeight());
        g2d.drawImage(platform[i].getImage(), platform[i].getX(), platform[i].getY(), this);
    }

    //draw guy
    g2d.drawImage(guy.getImage(), guy.getX(), guy.getY(), this);

    //destroy unneeded process
    Toolkit.getDefaultToolkit().sync();
    g.dispose();
}

基本上,循环功能决定角色是否需要移动,如果是,则移动它。

1 个答案:

答案 0 :(得分:0)

很难让Java作为实时系统工作......因为未知因素,例如操作系统将安排您的进程运行和GC。由于您尝试以200 fps更新游戏(如果我的数学运算正确),您可能需要尝试以下方法。为了让游戏更顺畅,我会尝试找到当前事件被触发和最后一个事件之间的时间,现在理论上可能是5ms但有时它将是7ms(超级慢),有时它将是3ms(超级快速) )。你有两个事件之间的时间,我会计算动画应该在哪里,所以如果时间是3毫秒,那么动画将在5毫秒时间之前。让我们举一个简单的例子,你试图每5ms更新一次图像的X位置。

//your current code
newX = X + 5px

//new code
//this wont always be 5ms
timeDiff = currentEventTime – lastEventTime;

newX = X + 5px (timeDiff/5ms)