2014-07-05 13 views
14

Ho problemi a distruggere gli sprite in Phaser.Distruggi gli sprite in Phaser

Ho un oggetto JavaScript, chiamiamolo Blocco. Block ha una proprietà sprite, che viene impostato in questo modo:

this.sprite = this.game.add.sprite(this.x, this.y, 'blocks', this.color); 

Ad un certo punto nel mio codice, Block si fa riferimento due diverse matrici:

square[0] = Block; 
destroy[0] = Block; 

su un ciclo di certo Update(), ho bisogno di distruggere lo sprite, quindi sto utilizzando il seguente codice:

square[0].sprite.destroy(true); //Destroy the sprite. 
square[0] = null; //Remove the reference. 

al ciclo successivo aggiornamento(), quando guardo distruggere [0], mi sarei aspettato di vedere:

destroy[0].sprite: null 

Tuttavia quello che sto vedendo è:

destroy[0].sprite: b.Sprite 

con le proprietà solo in default e impostata su false. La mia preoccupazione è che se dovessi impostare destroy [0] su null, cosa succederà a quell'oggetto sprite?

Verrà semplicemente spostato o verrà ripulito automaticamente? Devo prima distruggere l'oggetto Block in qualche modo? Inoltre, se destroy() non sta annullando il riferimento, in che modo è diverso da kill()?

Ogni pensiero in merito sarà molto apprezzato.

+2

Il garbage collector pulirà in su, se non v'è alcun riferimento ad esso. – Oriol

+0

Se hai trovato quello che cercavi, ti preghiamo di accettare una risposta. –

risposta

19

Differenza tra uccidere e distruggere

Kill si suppone per fermare il rendering, ma l'oggetto esiste ancora. È buono se vuoi creare un oggetto riutilizzabile. È possibile creare nuovamente l'oggetto senza il costo di creare nuovamente l'oggetto.

Destroy dovrebbe rimuovere l'oggetto e tutto ciò ad esso correlato. Lo usi quando vuoi inviare l'oggetto al garbage collector.

prega di notare che per alcuni oggetti come testo, non è possibile utilizzare kill, è possibile utilizzare solo destroy

Riferimento: http://www.html5gamedevs.com/topic/1721-how-to-remove-text/#entry12347

+0

Come posso manipolare l'oggetto con Garbage Collector? –

0

@ibnu è corretta. Destroy mette a fuoco l'oggetto, mentre kill interrompe il rendering. Tuttavia, la tua domanda è relativa a perdite di memoria e GC. Non sono un professionista di GC, ma ecco quello che penso stia accadendo.

//create an object 
this.sprite = this.game.add.sprite(this.x, this.y, 'blocks', this.color); 
//create additional references to the object 
square[0] = Block; 
destroy[0] = Block; 
//destroy the object via Phaser's call. Remove 1/2 reference 
square[0].sprite.destroy(true); //Destroy the sprite. 
square[0] = null; //Remove the reference. 

Ma destroy[0].sprite detiene ancora un riferimento al vostro sprite "distrutto". this.sprite probabilmente lo fa anche tu. Questo perché il metodo Phaser destroy rimuove solo le proprietà specifiche di Phaser dall'oggetto. JS is in charge of generic object Garbage Collection. L'oggetto lo sta sfuggendo perché hai ancora riferimenti validi nell'ambito.

Risolvere il problema rimuovendo il riferimento dall'ambito destroy[0].sprite = null o attendendo che lo stato successivo modifichi l'ambito (supponendo che destroy non sia una variabile statica).Non devi gestire le risorse di memoria da solo, JS! = C. Assicurati di non utilizzare le variabili leak tra gli ambiti di differenza.

What is JavaScript garbage collection? (anche se non credo che il comando delete è consigliato per GC più, non è certamente necessario Phaser)

Problemi correlati