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

时间:2015-04-15 17:53:20

标签: java swing loops

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

目前,我在paintComponent()课程中使用JPanel覆盖了以下设置来绘制这样的内容:

public void run() {
    while (running) {
        panel.update();
        panel.repaint();
        try {
            sleep(SLEEP_TIME);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

这种设置似乎工作得很整齐,但移动的形状和图像似乎有时会出现一两个像素。换句话说,这种运动并不像我想的那样顺畅。

我想知道是否有办法更有效地进行游戏循环,以避免在运动中出现口吃?

1 个答案:

答案 0 :(得分:1)

使循环速率固定的简便方法是使用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();
        }
    }
}