J'utilise Unity et parfois j'utilise le new
mot 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?
new Vector3
carVector3
c'est unstruct
. Si c'est une classe, c'est un problème. Lisez l'intégralité de l'article sur l'utilisation du pool d'objets.Réponses:
En C #, il existe deux types de types, grosso modo: les types de valeur et les types de référence .
Vous utilisez
new
lorsque 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).Vector3
est 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
Vector3
sont une valeur sûre.la source
int
champ 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