É errado criar novos objetos no Update ()?

8

Estou usando o Unity e, às vezes, estou usando a newpalavra-chave Update, como new Vector3()etc ...

Gostaria de saber se isso causa vazamento de memória? Quero dizer, em cada quadro, um novo Vector3 é criado. Se esta é a maneira de trabalhar, significa que existem milhares de vetores criados na memória. É verdade ou acho errado?

user98816
fonte
2
Isso soa como uma pergunta de um usuário típico de C ++ que não está familiarizado com os meandros do C #, seria uma suposição adequada?
Pharap
Eu respondi uma pergunta semelhante aqui . É bom fazer new Vector3porque Vector3é um struct. Se é uma classe, então isso é um problema. Leia o post completo sobre como usar o pool de objetos.
Programador

Respostas:

15

No C #, existem dois tipos de tipos, aproximadamente: tipos de valor e tipos de referência .

Você usa newquando cria os dois, mas os tipos de valor são criados na pilha (na maioria das vezes) e apenas os tipos de referência são criados no heap. Uma vez criados, os tipos de referência permanecem até o coletor de lixo, determinam que não são mais necessários e os coletam. Instâncias na pilha são destruídas eficientemente quando o quadro da pilha desaparece (quando a função em que foram criadas termina).

Vector3é um tipo de valor no Unity, portanto, quase todas as instâncias que você cria serão armazenadas na pilha e, portanto, baratas para criar e destruir. Então você provavelmente não está fazendo nada de errado aqui. Certamente não cria um vazamento de memória e quase certamente não será um problema de desempenho (você gostaria de criar um perfil para ter certeza, de qualquer maneira).

Criar muitos tipos de referência novos a cada quadro pode ser problemático, pois isso pode induzir o coletor de lixo a ser executado com mais frequência, causando problemas, uma vez que interrompe todos os seus threads para fazer seu trabalho. Mas tipos de valor como Vector3são uma aposta bastante segura.


fonte
11
Eu acho que você deve enfatizar que "os tipos de valor são criados na pilha (na maioria das vezes)" é válido apenas para variáveis ​​locais . Eu sei que é um pouco pedante, mas a maneira como está escrita no momento pode enganar os iniciantes. Um intcampo em um tipo de referência termina no heap, pois os tipos de referência são armazenados no heap. Além disso, +1
Doval
11
@Doval uma declaração muito mais precisa seria que "os tipos de valor são colocados no espaço alocado anteriormente, como na pilha ou dentro do espaço alocado de um tipo de referência".
catraca aberração