有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Swing“游戏循环”最佳实践

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

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

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

这种设置看起来很灵活,但移动的形状和图像有时会出现一两个像素的停顿。换句话说,运动并不像我希望的那样平稳

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


共 (1) 个答案

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