Menu
CoddyTech

Perché usare un pool di oggetti

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 37 di 50.

Una pistola che spara 10 proiettili al secondo per un minuto chiama Instantiate 600 volte e Destroy 600 volte. Ogni Instantiate copia il prefab con tutti i suoi componenti ed esegue Awake, OnEnable e Start. Ogni Destroy esegue OnDisable e OnDestroy e lascia in memoria l'oggetto, che diventa spazzatura. Il garbage collector di C# libera quella memoria in seguito e il suo lavoro ricade su alcuni fotogrammi e non su altri, causando scatti, soprattutto sui telefoni più lenti.

Un pool conserva gli oggetti invece di distruggerli. Un proiettile usato viene disattivato con SetActive(false) e torna nel pool; il colpo successivo ne preleva uno e lo attiva, mentre Instantiate viene eseguito solo quando il pool è vuoto. Dopo i primi secondi di fuoco, sparare non crea più nulla di nuovo e non lascia spazzatura. Quando un oggetto viene riutilizzato, Awake e Start non vengono eseguiti di nuovo: sono stati eseguiti una volta, quando l'oggetto è stato creato. Tutto ciò che deve ricominciare a ogni utilizzo, come un timer, la salute o una velocità, viene reimpostato in OnEnable o dal codice che preleva l'oggetto.

Il pooling conviene per gli oggetti che vengono creati e scartati spesso: proiettili, scintille, numeri dei danni, nemici in un gioco a ondate. Non conviene per un boss che appare una volta o un menu che si apre ogni tanto. Un pool occupa sempre memoria per i suoi oggetti inattivi, quindi mantiene un numero ragionevole di oggetti e lascia andare quelli in eccesso.

Provalo tu

Questa lezione non include una sfida di codice.

quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Architettura dei giochi in Unity