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.
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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti3Eventi
Eventi C# in UnityIscriviti in OnEnableCampi UnityEventGli eventi guidano l'interfaccia utenteRiepilogo: popup dell'obiettivo6Salvare con JSON
JsonUtilitySalva la partitaCaricamento e valori predefinitiRiepilogo: slot di salvataggio9Pooling degli oggetti
Perché usare un pool di oggettiUn pool con una codaObjectPool di UnityRiepilogo: pool di proiettili