[RESOLVIDO]Jogo em Java perde FPS se não segurar tecla

Pessoal, olha eu aqui mais uma vez precisando da ajuda de vocês.
Seguinte, estou criando um pequeno joguinho em Java, o problema é que o jogo sofre queda de FPS caso não esteja segurando nenhuma tecla! Tipo, meu tanque está andando na tela enquanto seguro W, ok. Mas se solto todas as teclas do teclado, o jogo começa a engasgar, perde FPS. Dai eu posso simplesmente segurar espaço, que nem é uma tecla utilizada no jogo e a imagem volta a rodar lisa. Vou deixar aqui o código do motor, detalhe, já tentei deixar a função Render do programa tanto na mesma thread, como em uma thread separada, resultado continua o mesmo.

abstract public class Motor implements WindowListener {

    private JFrame mainWindow;
    private static boolean active;
    private BufferStrategy bufferStrategy;
    private int TPSesperado;
    private double expectedNanosPerTick;
    Thread thread;
    
    public Motor() {
        mainWindow = new JFrame(
                "Abrindo o Jogo - Desenvolvimento de Jogos Digitais em Java");
        mainWindow.setSize(800, 600);
        mainWindow.addWindowListener(this);
        active = false;
    }

    public JFrame getMainWindow() {
        return mainWindow;
    }

    public static void terminate() {
        active = false;
    }

    public void run() {
        active = true;
        //load();
        TPSesperado = 30;
        expectedNanosPerTick = ContadorFPS.NANOS_IN_ONE_SECOND / TPSesperado;
        long nanoTimeAtNextTick = System.nanoTime();
        thread = new Thread(){
            public void run(){
                load();
                while(true){
                    render();
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Motor.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        };
        thread.start();
        while (active) {
            new ContadorFPS().update();
            if(System.nanoTime() > nanoTimeAtNextTick){
                nanoTimeAtNextTick += expectedNanosPerTick;
                update();
                //render();
            }
        }
        unload();
    }

    public void load() {
        mainWindow.setUndecorated(true);
        mainWindow.setIgnoreRepaint(true);
        mainWindow.setLocationRelativeTo(null);
        mainWindow.setVisible(true);
        mainWindow.createBufferStrategy(2);
        bufferStrategy = mainWindow.getBufferStrategy();
        onLoad();
        new ContadorFPS().start();
    }

    public void unload() {
        onUnload();
        thread.stop();
        bufferStrategy.dispose();
        mainWindow.dispose();
    }

    public void update() {
        new ContadorFPS().countTick();
        onUpdate();
        Thread.yield();
    }

    public void render() {
        Graphics2D g = (Graphics2D) bufferStrategy.getDrawGraphics();
        g.setColor(Color.black);
        g.fillRect(0, 0, mainWindow.getWidth(), mainWindow.getHeight());
        Pinturas.pinturas(g);
        g.dispose();
        bufferStrategy.show();
    }

    abstract public void onLoad();

    abstract public void onUnload();

    abstract public void onUpdate();

    public int getWidth() {
        return mainWindow.getWidth();
    }

    public int getHeight() {
        return mainWindow.getHeight();
    }

    public void windowClosing(WindowEvent e) {
        terminate();
    }

    public void windowOpened(WindowEvent e) {
    }

    public void windowClosed(WindowEvent e) {
    }

    public void windowIconified(WindowEvent e) {
    }

    public void windowDeiconified(WindowEvent e) {
    }

    public void windowActivated(WindowEvent e) {
    }

    public void windowDeactivated(WindowEvent e) {
    }
}

e aqui vai o código do render

public class Pinturas {
public static void pinturas(Graphics2D g){
renderJogo(g);
}
protected static void renderJogo(Graphics2D g){
g.setColor(Color.red);
g.fillRect(Variaveis.qx, Variaveis.qy, 10, 10);
g.drawImage(Variaveis.IMG_TANK, Variaveis.playerx, Variaveis.playery, null);
}
}

Se alguém souber como resolver isso, fico agradecido.

Bom… Achei meu problema :slight_smile: era o Linux. O gerenciador de recursos do Linux baixava a prioridade do programa se identificasse que o usuário não estava interagindo com ele. No windows 10 rodou liso.

1 curtida