Java2D游戏随机断断续续。我究竟做错了什么?

时间:2018-02-01 16:49:02

标签: java swing jpanel frame-rate game-loop

我目前正在使用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();
    }
}

我已多次尝试省略某些代码部分,认为它们会造成滞后,但我发现没有什么特别引起它,所以我认为问题在于我的游戏循环机制。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

你的游戏循环必须包含一个" Thread.sleep"为了睡眠所需的时间来尊重你的目标FPS。

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

您当前的实现充斥着绘制管理器,当底层缓冲区已满并且垃圾收集器将完成其工作时,将出现减速。

答案 1 :(得分:0)

虽然您可以用两种不同的方法拆分渲染和逻辑,但问题在于它们存在于同一个线程中。

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

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