Estou usando o Unity e, às vezes, estou usando a new
palavra-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?
new Vector3
porqueVector3
é umstruct
. Se é uma classe, então isso é um problema. Leia o post completo sobre como usar o pool de objetos.Respostas:
No C #, existem dois tipos de tipos, aproximadamente: tipos de valor e tipos de referência .
Você usa
new
quando 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
Vector3
são uma aposta bastante segura.fonte
int
campo em um tipo de referência termina no heap, pois os tipos de referência são armazenados no heap. Além disso, +1