Ist es falsch, neue Objekte in Update () zu erstellen?

8

Ich benutze Unity und manchmal benutze ich das newSchlüsselwort in Update, wie new Vector3()etc ...

Ich frage mich, ob dies einen Speicherverlust verursacht. Ich meine, in jedem Frame wird ein neuer Vector3 erstellt. Wenn dies die Arbeitsweise ist, bedeutet dies, dass Tausende von Vektoren im Speicher erstellt werden. Ist es wahr oder denke ich falsch?

user98816
quelle
2
Dies klingt nach einer Frage eines typischen C ++ - Benutzers, der mit den Vor- und Nachteilen von C # nicht vertraut ist. Wäre das eine angemessene Annahme?
Pharap
Ich antwortete eine ähnliche Frage hier . Es ist in Ordnung zu tun, new Vector3weil Vector3es ein ist struct. Wenn es eine Klasse ist, dann ist das ein Problem. Lesen Sie den gesamten Beitrag über die Verwendung von Objektpooling.
Programmierer

Antworten:

15

In C # gibt es ungefähr zwei Arten von Typen: Werttypen und Referenztypen .

Sie werden verwendet, newwenn Sie beide erstellen, aber Werttypen werden (meistens) auf dem Stapel erstellt, und nur Referenztypen werden auf dem Heap erstellt. Nach der Erstellung bleiben die Referenztypen erhalten, bis der Garbage Collector vorbeikommt, feststellen, dass sie nicht mehr benötigt werden, und sammeln sie. Instanzen auf dem Stapel werden effizient zerstört, wenn der Stapelrahmen verschwindet (wenn die Funktion, für die sie erstellt wurden, endet).

Vector3ist ein Werttyp in Unity, sodass fast alle Instanzen, die Sie jemals erstellt haben, auf dem Stapel gespeichert werden und daher kostengünstig sowohl erstellt als auch zerstört werden können. Sie machen hier also wahrscheinlich nichts falsch. Es führt mit Sicherheit nicht zu einem Speicherverlust, und es handelt sich mit ziemlicher Sicherheit nicht um ein Leistungsproblem (Sie möchten auf jeden Fall ein Profil erstellen, um sicherzugehen).

Das Erstellen vieler neuer Referenztypen für jeden Frame kann problematisch sein, da dies dazu führen kann, dass der Garbage Collector häufiger ausgeführt wird, was zu Problemen führt, da alle Ihre Threads angehalten werden, um ihre Arbeit zu erledigen. Aber Werttypen wie Vector3sind eine ziemlich sichere Wette.


quelle
1
Ich denke, Sie sollten betonen, dass "Werttypen (meistens) auf dem Stapel erstellt werden" nur für lokale Variablen gilt . Ich weiß, dass es ein bisschen pedantisch ist, aber die Art und Weise, wie es derzeit formuliert ist, kann Anfänger irreführen. Ein intFeld in einem Referenztyp landet auf dem Heap, da Referenztypen auf dem Heap gespeichert sind. Davon abgesehen, +1
Doval
1
@Doval Eine viel genauere Aussage wäre, dass "Werttypen in einen zuvor zugewiesenen Speicherplatz wie auf dem Stapel oder in den zugewiesenen Speicherplatz eines Referenztyps gestellt werden".
Ratschenfreak