java.swing.Timer和java.util.Timer以及Thread.sleep()的时间步长不均匀

java.swing.Timer和java.util.Timer以及Thread.sleep()的时间步长不均匀,java,animation,timer,sleep,Java,Animation,Timer,Sleep,我不明白为什么这个计时器会发出刺耳的声音。这是一个依赖于平台的问题吗?我正在用这种动画编写一个2D游戏,我对不均匀的帧速率感到沮丧。以下是简化示例的代码: import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import javax.swing.JPanel; public class AnimationTest extends JPan

我不明白为什么这个计时器会发出刺耳的声音。这是一个依赖于平台的问题吗?我正在用这种动画编写一个2D游戏,我对不均匀的帧速率感到沮丧。以下是简化示例的代码:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;

import javax.swing.JPanel;

public class AnimationTest extends JPanel
{
    private static final long serialVersionUID = 1L;
    private Point location = new Point(0, 300);
    private int speed = 3;

    public AnimationTest()
    {
        setPreferredSize(new Dimension(800, 600));
    }

    public void timeStep()
    {
        move();
        repaint();
        currentTime = System.nanoTime();
        System.out.println(currentTime - previousTime);
        previousTime = currentTime;
    }

    private void move()
    {
        location.x += speed;
        if(location.x >= 800) location.x = 0;
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        Graphics2D g2d = (Graphics2D) g;
        super.paintComponent(g2d);
        g2d.fillOval(location.x, location.y, 40, 40);
    }
}
以下是主要的方法:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class AnimationTestMain
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Test");
        final AnimationTest test = new AnimationTest();
        frame.add(test);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

        int animationMethod = 0;

        if(animationMethod == 0)
        {
            new javax.swing.Timer(10, new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    test.timeStep();
                }
            }).start();
        }
        else if(animationMethod == 1)
        {
            Thread thread = new Thread(new Runnable()
            {
                @Override
                public void run()
                {
                    while(true)
                    {
                        test.timeStep();
                        try
                        {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {}
                    }
                }
            });
            thread.start();
        }
        else if(animationMethod == 2)
        {
            java.util.Timer timer = new Timer();
            timer.scheduleAtFixedRate(new TimerTask()
            {
                @Override
                public void run()
                {
                    while(true)
                    {
                        test.timeStep();
                        try
                        {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {}
                    }
                }
            }, 0, 10);
        }
    }
}

修改animationMethod变量不会改变很多结果。您可以在纳秒打印输出中看到不均匀的帧速率。救命啊

摆动计时器是最不精确的选项

还有两个其他选项:

  • 实用定时器(中等精度)
  • 自有螺纹(最高精度)
退房


如果您选择制作自己的线程,请查看游戏循环。

它有多不均匀。。。?你能给出一个打印输出的例子吗?当它打嗝时,CPU的时间花在哪里?缓冲区刷新时是否会发生这种情况?是否有任何操作(除了动画)你可以使用这样一个没有突发性的计时器15629506 15588454 15626427 15554074 15493521 15623861 15574086 1576004 17558948 15506351 156736336 16722515 15402694 15936369 15368313 15617191 15583323 15569980 15657217 15632071 15565363 15488390 15497113 1561033 15612059 15562797 1573241 15469916 1567211 1566594015637716 15516614 15593585 15581784 1565388 15600256 15644388 15538678 15536113 158455442 15413470 15583836 15648493您是在一个单用户系统上,配置充分,没有占用CPU和内核的CPU要求的后台作业吗?这些差异似乎占每个间隔总时间的很小%,因此看起来像是轻微的噪音。一定是发生了别的事情使它变得参差不齐。