Java Swing 'game loop' 最佳实践

标签 java swing loops

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

目前,我正在使用以下设置,并在 JPanel 类中覆盖 paintComponent() 来绘制如下内容:

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

此设置似乎运行良好,但移动形状和图像有时似乎会卡顿一两个像素。换句话说, Action 并不像我希望的那么顺利。

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

最佳答案

固定周期率的一个简单方法是使用 ScheduledExecutorService

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(() -> {
    panel.update();
    panel.repaint();
}, 0, 16, TimeUnit.MILLISECONDS);

另一种方法是自己完成,根据该过程所用的时间计算 sleep 时间。

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();
        }
    }
}

关于Java Swing 'game loop' 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29657353/

相关文章:

java - 从随机目录加载类时出现错误名称错误

java - 使用 GWT 在 Donut Highchart 上单击事件

java - JNLP 在加载时未正确加载

Java - 围绕圆绘制正方形

java - 这些 switch 语句有哪些替代方案?

java - 比较 2 个列表中的常见数字

java - 使用 JavaFX 端口的 Android 上的 NFC

java - 定时器的嵌套

excel - 对文件夹中的所有文件执行 VBA 宏

循环内的 JavaScript 闭包——简单实用的例子