Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Reinicialização do jogo "dobra" uso da memória RAM

Olá.

A reinicialização do jogo praticamente dobra o uso da memória RAM.

O que posso fazer para evitar que isso aconteça? Por que isso acontece?

código:

public void reiniciarJogo() {
        containerSurfaceView.removeView(this.game);
        this.game = new Game(this);
        containerSurfaceView.addView(game);
        onResume();
    }

    @Override
    protected void onResume() {
        super.onResume();

        thread = new Thread(this.game);
        thread.start();
        game.inicializaJogo();
    }
4 respostas

Sempre que você chama o onResume, cria uma thread nova.

Antes de reiniciar o jogo, basta destruir a thread atual, antes de chamar o onResume.

Testei thread.interrupt(), mas não deu certo.

Observei que só de criar um novo objeto Game a memória dobra!

=> Tem como liberar o espaço de memória que o objeto ocupava antes de refazer o SurfaceView e de iniciar a thread?

public void reiniciarJogo() {
        containerSurfaceView.removeView(this.game);
        this.game = new Game(this);  //aqui duplica!
        thread.interrupt();

//        comentados para teste na memória!
//        containerSurfaceView.addView(game);
//        onResume();
solução!

thread.interrupt não vai parar a thread imediatamente enquanto ela estiver fazendo alguma tarefa.

Perceba que o objeto Game representa o fluxo principal do jogo, logo é de se esperar que ele seja o responsável por consumir maior parte da memória, de forma que ao criar dois objetos desses a memória consumida dobrar.

Não tem como liberar a memória imediatamente, pois estamos sujeitos ao garbage collector da VM. Temos a certeza de que o objeto antigo será limpo da memória, mas não podemos saber exatamente quando.

Em vez de criar um novo Game, minha sugestão seria apenas resetar os valores do objeto Game atual.

No entanto, caso queira criar um novo Game, poderíamos usar a flag isRunning = false para matar a thread atual.

ok. Obrigado.