Eu li sobre esse padrão várias vezes (de uma perspectiva de melhores práticas):
Alocação de memória : em vez de instanciar o novo objeto rapidamente, sempre considere criar e usar conjuntos de objetos. Isso ajudará a menos fragmentação da memória e fará com que o coletor de lixo funcione menos.
No entanto, não sei o que realmente significa. Como posso implementá-lo?
Por exemplo, eu posso instanciar um GameObject
usando o Instantiate
método da Unity?
Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity);
Esse uso é desencorajado? O que mais isso pode significar?
unity
c#
design-patterns
memory-efficiency
Muhammad Faizan Khan
fonte
fonte
Respostas:
Se você planeja instanciar muitas instâncias da mesma pré-fabricada, definitivamente deve pensar em usar o pool de objetos. Chamar a função Instanciar do Unity é um dos métodos mais exigentes que você pode fazer.
O pool de objetos é quando você instancia as prefabs antes de serem usadas. Eles são desativados imediatamente após a instanciação e reativados somente quando são necessários. Enquanto isso aumenta o uso de memória, evita a sobrecarga da CPU de instanciar durante o jogo.
Por exemplo, atualmente estou trabalhando em um jogo de balas que exige que centenas de balas sejam geradas em tempo de execução. Inicialmente, tentei fazer o jogo sem o pool de objetos, mas isso acabou sendo um desastre (menos de 2 qps). Agora, acumulo 500 marcadores antes do jogo começar e o jogo corre surpreendentemente rápido (200 fps).
Há situações em que o pool de objetos não pode ser usado. Por exemplo, se você tem um jogo em que a entrada do jogador determina qual pré-fabricada é gerada, talvez você não tenha outra opção a não ser usar a chamada Instantiate normal. O pool de objetos só é possível quando você sabe com antecedência quais objetos serão necessários.
O tutorial do YouTube de Sebastian Lague é um ótimo recurso para aprender sobre pool de objetos: https://youtu.be/LhqP3EghQ-Q
fonte