Java2D 游戏随机卡顿。我究竟做错了什么?

Java2D game stutters randomly. What am I doing wrong?

我目前正在使用 Swing 组件开发 2D 游戏。 每次我 运行 我的游戏都会在某些时候随机断断续续。这是我的游戏循环代码:

public class FixedTSGameLoop implements Runnable
{
    private MapPanel _gamePanel;

    public FixedTSGameLoop(MapPanel panel)
    {
        this._gamePanel = panel;
    }

    @Override
    public void run()
    {
        long lastTime = System.nanoTime(), now;
        double amountOfTicks = 60.0;
        double amountOfRenders = 120.0;
        double nsTick = 1000000000 / amountOfTicks;
        double nsRender = 1000000000 / amountOfRenders;
        double deltaTick = 0;
        double deltaRender = 0;
        while (this._gamePanel.isRunning())
        {
            now = System.nanoTime();
            deltaTick += (now - lastTime) / nsTick;
            deltaRender += (now - lastTime) / nsRender;
            lastTime = now;
            while (deltaTick >= 1)
            {
                tick();
                deltaTick--;
            }
            while (deltaRender >= 1)
            {
                render();
                deltaRender--;
            }
        }
    }

    private void tick()
    {
        /**
         * Logic goes here:
         */
        this._gamePanel.setLogic();
    }

    private void render()
    {
        /**
         * Rendering the map panel
         */
        this._gamePanel.repaint();
    }
}

我曾多次尝试省略某些代码部分,认为它们会导致延迟,但我没有发现任何特别导致它的原因,所以我认为问题出在我的游戏循环机制上。 感谢您的帮助!

您的游戏循环必须包含 "Thread.sleep" 才能休眠达到您的目标 FPS 所需的时间。

主循环应该包含 1 个 tick() 和 1 个 render()。

您当前的实现正在充斥绘制管理器,当底层缓冲区已满以及垃圾收集器将完成其工作时,速度会变慢。

虽然将渲染和逻辑拆分为两种不同的方法很好,但问题在于它们存在于同一线程中。

减少延迟需要做的是将它们放在不同的线程中。呈现线程将从逻辑线程请求当前状态的快照(以防止并发修改)并呈现该快照。

现在,如果一个渲染花费的时间太长,或者如果一个逻辑步骤花费的时间太长,则另一个检查将不得不等待它完成才能开始工作。