游戏循环滞后

Lags in game loop

这是我的游戏循环代码:

public void run() {
    running = true;

    boolean renderCheck = false;
    double firstTime = 0;
    double lastTime = System.nanoTime() / 1000000000.0;
    double passedTime = 0;
    double unprocessedTime = 0;

    double frameTime = 0;
    int frames = 0;
    int fps = 0;

    while (running) {
        firstTime = System.nanoTime() / 1000000000.0;
        passedTime = firstTime - lastTime;
        lastTime = firstTime;

        unprocessedTime += passedTime;
        frameTime += passedTime;

        while (unprocessedTime >= UPDATE_CAP) {
            tick();
            unprocessedTime -= UPDATE_CAP;
            renderCheck = true;
        }

        if (frameTime >= 1.0) {
            frameTime = 0;
            fps = frames;
            frames = 0;
            System.out.println(fps);
        }

        if (renderCheck) {
            render();
            frames++;
            renderCheck = false;
        } else {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

这是一个渲染区:

private void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null) {
        this.createBufferStrategy(3);
        return;
    }

    Graphics graphics = bs.getDrawGraphics();

    graphics.setColor(Color.black);
    graphics.fillRect(0, 0, WIDTH, HEIGHT);

    handler.render(graphics);

    graphics.dispose();
    bs.show();
}

这是打勾的部分(没有必要显示处理程序的其他代码,因为阅读起来太多了):

private void tick() {
    handler.tick();
}

那么主要的问题就在接下来的事情上了。当我按下按钮时,我的角色必须开始移动。而且,实际上,它确实存在,但有一些延迟,使这个过程看起来很糟糕。一秒钟之后,一切都进行得很顺利。 (我已经检查了 CPU 加载 - 一切正常)

此问题仅在 linux PC 上发生。我已经在 Windows 10 上检查过它的 exe 格式,一切正常!有点奇怪。

这个延迟初始化可能是你的问题:

private void render() {
    BufferStrategy bs = this.getBufferStrategy();
    if (bs == null) {
        this.createBufferStrategy(3);
        return;
    }
    ...

您是否考虑过 render() 函数的第一次调用 getBufferStrategy() 将 return null 的事实,此时

  • 你会先创建它(没关系)

  • 然后 return 没有任何动作 (这很可疑)

render 的后续调用将实际执行渲染...稍后。 如果您确定无论如何都需要那个 bufferStrategy,那么立即创建它是有意义的初始化系统时。

Soo,我终于找到了解决这个问题的方法!

只需在您的静态 main 方法中通过编写以下代码将系统属性设置为 java2d:

public static void main(String argsp[]) {
    System.setProperty("sun.java2d.opengl", "true");
    new Game();
}