Est-ce mal de créer de nouveaux objets dans Update ()?

8

J'utilise Unity et parfois j'utilise le newmot clé e Update, comme new Vector3()etc ...

Je me demande si cela provoque une fuite de mémoire? Je veux dire que dans chaque image, un nouveau Vector3 est créé. Si c'est la façon de travailler, cela signifie qu'il y a des milliers de vecteurs créés en mémoire. Est-ce vrai ou est-ce que je pense mal?

user98816
la source
2
Cela ressemble à une question d'un utilisateur C ++ typique qui ne connaît pas les tenants et aboutissants de C #, serait-ce une hypothèse adéquate?
Pharap
J'ai répondu à une question similaire ici . C'est bien de le faire new Vector3car Vector3c'est un struct. Si c'est une classe, c'est un problème. Lisez l'intégralité de l'article sur l'utilisation du pool d'objets.
Programmeur

Réponses:

15

En C #, il existe deux types de types, grosso modo: les types de valeur et les types de référence .

Vous utilisez newlorsque vous créez les deux, mais les types de valeur sont créés sur la pile (la plupart du temps) et seuls les types de référence sont créés sur le tas. Une fois créés, les types de référence restent jusqu'à ce que le ramasse-miettes arrive, déterminent qu'ils ne sont plus nécessaires et les collectent. Les instances sur la pile sont détruites efficacement lorsque le cadre de pile disparaît (lorsque la fonction à laquelle elles ont été créées se termine).

Vector3est un type de valeur dans Unity, donc presque toutes les instances que vous créez seront stockées sur la pile et donc bon marché à la fois pour créer et détruire. Donc, vous ne faites probablement rien de mal ici. Cela ne crée certainement pas de fuite de mémoire, et ce ne sera certainement pas un problème de performances (vous voudrez certainement le profiler).

La création d'un grand nombre de nouveaux types de référence pour chaque trame peut être problématique car cela peut amener le garbage collector à s'exécuter plus fréquemment, provoquant des accrochages car il suspend tous vos threads pour faire son travail. Mais les types de valeur comme Vector3sont une valeur sûre.


la source
1
Je pense que vous devez souligner que "les types de valeurs sont créés sur la pile (la plupart du temps)" n'est vrai que pour les variables locales . Je sais que c'est un peu pédant, mais la façon dont il est libellé actuellement peut induire les débutants en erreur. Un intchamp dans un type de référence se retrouve sur le tas car les types de référence sont stockés sur le tas. Cela mis à part, +1
Doval
1
@Doval une déclaration beaucoup plus précise serait que "les types de valeur sont placés dans l'espace précédemment alloué comme sur la pile ou à l'intérieur de l'espace alloué d'un type de référence".
ratchet freak