A recipe of: Flappy birds! – (Disposing Objects and GC)

Con questo Tutorial Andremo a migliorare l’utilizzo della memoria da parte della nostra applicazione tramite il disposing degli elementi e l’utilizzo del garbage collector.

 

Ingredienti:

 

Disposing Objects

Abbiamo gia visto, in uno degli scorsi tutorial, come andare a disporre i vari oggetti del nostro programma.

Ora, avendo aggiunto altri elementi come nuove texture, e nuovi loop di game (a ogni loop le texture vengono ricreate), dobbiamo andare a fare un po’ di pulizie.

 

Disposing degli ostacoli

Andiamo nella nostra classe “ostacoli” e aggiungiamo una funzione di disposing, per farsi che ogni tubo venga eliminato correttamente alla chiusura di uno stato di gioco.

 

public void dispose(){
    TuboSuperiore.dispose();
    TuboInferiore.dispose();
}

Questa funzione la andremo a richiamare quando faremo il dispose di un nostro stato di gioco.

 

Disposing del protagonista

Facciamo la stessa cosa per il protagonista, entriamo nella classe “Bird” e andiamo a creare un metodo dispose dove ci liberiamo della texture del giocatore.

public void dispose(){
    texture.dispose();
}

Anche questo metodo lo andremo a richiamare quando andremo a fare il dispose del nostro stato di gioco.

 

Disposing dello stato di gioco

Ora non ci rimane che creare il metodo dispose nello stato di gioco che andremo a richiamare ogni qualvolta ci sara’ un cambio di stato.

Dobbiamo ricordarci di andare a fare il dispose di tutti gli sotacoli presenti nel gioco, quindi sara’ necessario creare un ciclo.

public void dispose() {
    sfondo.dispose();
    bird.dispose();
    for(Ostacoli ostacolo : tubi){
        ostacolo.dispose();
    }
    System.gc();

}

Il Garbage Collector

Come vedete nel dispose del nostro stato di gioco, sono andato ad aggiungere anche la stringa “System.gc()”, questa stringa, andra’ a richiamare il garbage collector e pulira’ la nostra applicazione da eventuali risorse inutilizzate.

 

Disposing GameState Manager

Una volta settati i vari dispose, dobbiamo andare a ricordare al nostro programma, che ogni volta che fa un “pop” di uno stato, deve anche lanciare il dispose di esso.

Per fare cio’ andate nella classe gamestatemanager  e aggiungete un .dispose dopo il pop:

public void pop(){
    stati.pop().dispose();
}

public void set(Stato stato){
    stati.pop().dispose();
    stati.push(stato);
}

Se ora provate a monitorare l utilizzo di memoria dell’applicazione, vedrete che e’ diventata stabile senza andare a aumentare a ogni ciclo di gioco.

 

I file aggiornati fino a questo tutorial : game1

 

 

Saluti dal vostro nabbo Developer

Marco Tamagno

Facebook

Google+

Rispondi