Loop de jogo em Java fazendo o Ubuntu congelar

1

Eu tenho feito programação web de front e back end há mais de um ano, e agora estou tentando aprender programação de jogos 2D em Java. Com base em várias fontes na Web e em um amigo meu, que é um desenvolvedor de jogos experiente, essa é uma configuração típica:

  
    

Window.java | Classe de configuração da janela

         

Game.java | Aula principal do jogo

  

Mas quando eu tento executar a classe Game , o quadro é aberto e, em seguida, congela, a única coisa que eu tenho controle é o meu mouse, nada mais. Eu sei que o problema ocorre no método render , porque o programa é executado corretamente quando esse método tem um corpo vazio.

Eu copiei o código exatamente do tutorial em que ele roda bem, e meu amigo que me enviou uma versão quase idêntica, que funciona em seu computador, causa o mesmo congelamento para mim. Tanto no tutorial quanto no teste do meu amigo, o sistema operacional é o Windows, o que me faz acreditar que isso é estritamente um problema do Ubuntu / Linux.

Eu tenho um processador Intel i7 3.4gHZ e 8 GB de RAM, portanto, processamento e memória não devem ser o problema aqui. Alguma idéia do que está acontecendo? Eu sei que isso é mais uma questão de programação, mas o fato de que o problema parece ser específico do Ubuntu me leva a postar aqui.

EDITAR

Eu isolei o problema em uma linha na classe Game: bs.show() . Por algum motivo, está congelando assim que tento mostrar a estratégia do buffer. Se eu criar a estratégia de buffer com 1 buffer, ele funciona bem, com algo maior que 1, ele congela.

Quando ele congelou o tempo mais recente, eu abri um desktop virtual e rodei top , o mais estranho é que o Java estava ocupando menos de 2% de CPU e 6% de memória. Isso simplesmente não se soma. Eu realmente preciso de alguma ajuda para o que está acontecendo aqui, eu fui até onde eu posso ir e não quero forçar mais reinicializações na minha máquina.

    
por samrap 07.11.2014 / 03:33

2 respostas

1

Estou tendo o mesmo problema ao executar seu código. Parece ser um problema de desempenho. Para consertar isso, adicione System.setProperty("sun.java2d.opengl", "true"); ao método main em Game.java assim,

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

Espero que isso ajude!

    
por yam_head 10.11.2014 / 15:28
1

Você está usando o próprio thread awt. Deve ser deixado sozinho para atender à capacidade de resposta do usuário. Leia um pouco sobre como usar os métodos SwingUtilities2.invokeLater e SwingUtilities2.invokeAndWait para se livrar dos problemas da janela de congelamento nos aplicativos Java Swing.

A abordagem seria:

  

1) Faça o seu material extenso em um Runnable (você está usando um)

     

2) No seu método principal, passe a instância Runnable para uma das opções acima   dois métodos na classe SwingUtilities2

Se você quiser ir mais longe, você também pode considerar o uso de Threads de trabalho.

    
por Horizon 15.11.2014 / 00:13