¿Está mal crear nuevos objetos en Update ()?

8

Estoy usando Unity y a veces estoy usando la newpalabra clave th Update, como new Vector3()etc ...

Me pregunto si esto causa pérdida de memoria. Quiero decir que en cada cuadro se crea un nuevo Vector3. Si esta es la forma de trabajar, significa que hay miles de Vectores creados en la memoria. ¿Es verdad o pienso mal?

usuario98816
fuente
2
Esto suena como una pregunta de un usuario típico de C ++ que no está familiarizado con los entresijos de C #, ¿sería una suposición adecuada?
Pharap
Respondí una pregunta similar aquí . Está bien hacerlo new Vector3porque Vector3es un struct. Si es una clase, entonces eso es un problema. Lea la publicación completa sobre el uso de la agrupación de objetos.
Programador

Respuestas:

15

En C # hay dos tipos de tipos, aproximadamente: tipos de valor y tipos de referencia .

Tu usas new cuando se crean ambos, pero los tipos de valor se crean en la pila (la mayoría de las veces), y solo los tipos de referencia se crean en el montón. Una vez creados, los tipos de referencia permanecen hasta que aparece el recolector de basura, determinan que ya no son necesarios y los recolecta. Las instancias en la pila se destruyen eficientemente cuando el marco de la pila desaparece (cuando termina la función en la que se crearon).

Vector3es un tipo de valor en Unity, por lo que casi todas las instancias que crees se almacenarán en la pila y, por lo tanto, son baratas tanto para crear como para destruir. Así que probablemente no estés haciendo nada mal aquí. Ciertamente no crea una pérdida de memoria, y casi seguro que no será un problema de rendimiento (de todos modos, querría tener un perfil seguro).

Crear una gran cantidad de nuevos tipos de referencia en cada cuadro puede ser problemático, ya que puede inducir al recolector de basura a ejecutarse con mayor frecuencia, causando problemas al pausar todos los hilos para hacer su trabajo. Pero los tipos de valor como Vector3son una apuesta bastante segura.


fuente
1
Creo que debe enfatizar que "los tipos de valores se crean en la pila (la mayoría de las veces)" solo es cierto para las variables locales . Sé que es un poco pedante, pero la forma en que está redactado actualmente puede engañar a los principiantes. Un intcampo en un tipo de referencia termina en el montón ya que los tipos de referencia se almacenan en el montón. Aparte de eso, +1
Doval
1
@Doval, una declaración mucho más precisa sería que "los tipos de valores se colocan en el espacio asignado previamente, como en la pila o dentro del espacio asignado de un tipo de referencia".
monstruo de trinquete