Java Swing';游戏循环';最佳做法

Java Swing';游戏循环';最佳做法,java,swing,loops,Java,Swing,Loops,为了清楚起见,我正在寻找用Java(使用Swing)实现“游戏循环”的最佳替代方案 目前,我正在使用paintComponent()在JPanel类中覆盖的以下设置来绘制这样的东西: public void run() { while (running) { panel.update(); panel.repaint(); try { sleep(SLEEP_TIME); } catch (Excep

为了清楚起见,我正在寻找用Java(使用Swing)实现“游戏循环”的最佳替代方案

目前,我正在使用
paintComponent()
JPanel
类中覆盖的以下设置来绘制这样的东西:

public void run() {
    while (running) {
        panel.update();
        panel.repaint();
        try {
            sleep(SLEEP_TIME);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}
这种设置看起来很灵活,但移动的形状和图像有时会出现一两个像素的停顿。换句话说,运动并不像我希望的那样平稳


我想知道是否有一种方法可以更有效地进行游戏循环,即避免动作中的口吃?

一种简单的固定循环速率的方法是使用
ScheduledExecutorService

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(() -> {
    panel.update();
    panel.repaint();
}, 0, 16, TimeUnit.MILLISECONDS);
另一种方法是根据睡眠时间计算自己的睡眠时间

public void run() {
    long time = System.currentTimeMillis();
    while (running) {
        panel.update();
        panel.repaint();
        long sleep = 16 - (System.currentTimeMillis() - time);
        time += 16;
        try {
            sleep(sleep);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

使循环率固定。我该怎么做?睡眠时间的值是多少?Swing通常可以实现非常高的帧速率。口吃很可能是由于您的程序编写的某些方式造成的,并且您提供的小样本不足以确定问题。请参见SLEEP_TIME的值为16。在绘制图形时,它是否使用某种并发锁,以便在更新图形时无法进行绘制?否则,如果你画一些新外观只更新了一半的形状,它们很容易结巴。