Ich benutze Unity und manchmal benutze ich das new
Schlü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?
new Vector3
weilVector3
es ein iststruct
. Wenn es eine Klasse ist, dann ist das ein Problem. Lesen Sie den gesamten Beitrag über die Verwendung von Objektpooling.Antworten:
In C # gibt es ungefähr zwei Arten von Typen: Werttypen und Referenztypen .
Sie werden verwendet,
new
wenn 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).Vector3
ist 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
Vector3
sind eine ziemlich sichere Wette.quelle
int
Feld in einem Referenztyp landet auf dem Heap, da Referenztypen auf dem Heap gespeichert sind. Davon abgesehen, +1