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.
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.