2012-03-05 10 views
6

Ho creato un gioco HTML5 composto da molti piccoli livelli. Quando il giocatore arriva alle porte, viene caricato un altro livello. Quando un livello è caricarla fondamentalmente solo imposta tutti gli array esempio per [] e poi spinge roba in loro, attraverso la creazione di nuove istanze di cose, ad esempio:In Javascript, dovrei eliminare le istanze del livello precedente dopo averne caricato uno nuovo?

enemies = [] //this has previously been full of pointers from the old level 
for (i = 0; i < n_enemies; i ++) 
    enemies.push(new Enemy()); 

Ma, si è giunti alla mia attenzione che solo l'impostazione un array pieno di puntatori a [], in realtà non elimina le istanze! Quindi, javascript lo fa automaticamente? O devo io stesso delete ogni istanza?

risposta

3

Se gli oggetti che erano nell'array non sono più referenziati da nessuna parte, verranno raccolti. Non ci sono specifiche che dichiarano quando ciò accadrà, ma dovrebbe essere presto dopo averle rimosse dalla Matrice.

Questo non dovrebbe presentare una perdita di memoria.

+2

Anche 'delete' è definito solo per le proprietà degli oggetti, quindi javascript non contiene nemmeno un modo per eliminare le variabili dell'array - devi solo presumere che il motore js si occuperà della garbage collection dopo che tutti i riferimenti sono stati rimossi. – wheresrhys

+0

wheresrhys - I membri dell'array sono solo proprietà con nomi numerici. Elimina anche su di essi (ad esempio 'cancella array ['0']' rimuove il primo membro di un array che inizia da zero), ma come dice Jivings, non è necessario qui. – RobG

+0

@RobG - Probabilmente avrei dovuto essere più chiaro - con "variabili di array" intendevo le variabili che sono array, piuttosto che i valori primitivi memorizzati negli array. – wheresrhys

1

È come qualsiasi altro linguaggio di programmazione. Se c'è un riferimento all'oggetto, non verrà cancellato.

ad es.

enemies = []; 
enemy = new Enemy(); 
enemies.push(enemy); 
enemies = []; 

Nel caso in cui non si crea un riferimento all'oggetto dopo lo svuotamento nemici, oggetto nemico verrà eliminato anche

enemies.push(new Enemy()); 
+0

* qualsiasi altra lingua di programmazione ** raccolta dati inutili **. Se lavori in una lingua non GC, dovrai gestire autonomamente l'allocazione della memoria. – Davy8

2

io non so molto di giochi in via di sviluppo, ma di solito in Javascript compensazione Array è fatto in questo modo, e questo è una buona pratica

enemies.length = 0; 

controllo questo post

+0

+1 Funziona esattamente come l'impostazione dell'array su '[]'. – Jivings

+0

Non ne ho mai sentito parlare prima. Sembra funzionare (appena testato in Chrome) ma qualsiasi riferimento a questo è una buona pratica? – Davy8

+0

OK, ma credo che questo dovrebbe essere un commento, in quanto non risponde direttamente alla domanda. Grazie. L'ho provato anche in Chrome, funziona, ma non l'ho letto da nessuna parte. Se è il modo "corretto", perché non ci sono più persone che ne parlano? – corazza

1

Non c'è il comando free in JavaScript, quindi non è possibile "liberare" alcuna memoria. Tutto quello che puoi fare è: uccidere tutti i riferimenti (puntatori) su qualche oggetto. Alla fine, il garbage collector cercherà gli oggetti che non sono più visibili a nessuno.

O meglio: il GC alla fine raccoglierà tutta la memoria che può ancora essere raggiunta e dimentica il resto. Questo è il motivo per cui solo gli oggetti live costano in un ambiente GC.

Ma c'è un problema: il GC non dice agli oggetti che sono morti. Quindi se il tuo oggetto nemico ha bisogno di una pulizia, allora devi farlo manualmente.

+0

Non c'è? Sono abbastanza sicuro che ci sia, è una parola chiave e ne leggo da qualche parte! +1 per tutte le informazioni utili. – corazza

+1

@Bane [L'operatore di cancellazione] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/delete) – Jivings

+0

Aha! Questo ha chiarito molto. – corazza

Problemi correlati