È sbagliato creare nuovi oggetti in Update ()?


8

Sto usando Unity e a volte sto usando la newparola chiave in Update, come new Vector3()ecc ...

Mi chiedo se questo causa perdita di memoria? Voglio dire in ogni frame viene creato un nuovo Vector3. Se questo è il modo di lavorare, significa che ci sono migliaia di vettori creati in memoria. È vero o penso male?


2
Sembra una domanda da parte di un tipico utente C ++ che non ha familiarità con i dettagli di C #, sarebbe un presupposto adeguato?
Pharap,

Ho risposto a una domanda simile qui . Va bene new Vector3perché Vector3è un struct. Se è una classe, allora è un problema. Leggi l'intero post sull'utilizzo del pool di oggetti.
Programmatore

Risposte:


15

In C # ci sono due tipi di tipi, approssimativamente: tipi di valore e tipi di riferimento .

Usate new quando si creano entrambi, ma i tipi di valore vengono creati nello stack (la maggior parte delle volte) e sull'heap vengono creati solo i tipi di riferimento. Una volta creati, i tipi di riferimento restano attivi fino a quando non viene visualizzato il Garbage Collector, determinano che non sono più necessari e li raccolgono. Le istanze nello stack vengono distrutte in modo efficiente quando il frame dello stack scompare (quando termina la funzione creata).

Vector3è un tipo di valore in Unity, quindi quasi tutte le istanze che crei saranno archiviate nello stack e quindi economiche per creare e distruggere. Quindi probabilmente non stai facendo nulla di male qui. Certamente non crea una perdita di memoria, e quasi sicuramente non sarà un problema di prestazioni (ti consigliamo di fare il profilo per essere sicuro, comunque).

La creazione di molti nuovi tipi di riferimento per ogni frame può essere problematica poiché ciò può indurre il garbage collector a essere eseguito più frequentemente, causando intoppi mentre mette in pausa tutti i thread per fare il suo lavoro. Ma i tipi di valore come Vector3sono una scommessa abbastanza sicura.


1
Penso che dovresti sottolineare che "i tipi di valore vengono creati nello stack (il più delle volte)" è vero solo per le variabili locali . So che è un po 'pedante ma il modo in cui è attualmente formulato può fuorviare i principianti. Un intcampo in un tipo di riferimento finisce nell'heap poiché i tipi di riferimento sono memorizzati nell'heap. A parte questo, +1
Doval

1
@Doval un'affermazione molto più accurata sarebbe che "i tipi di valore vengono messi nello spazio allocato in precedenza come nello stack o all'interno dello spazio allocato di un tipo di riferimento".
maniaco del cricchetto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.