Perché usare un pool di oggetti
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 46 di 64.
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.
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozio3Eventi
Eventi C# in UnityIscrizione in OnEnableCampi UnityEventGli eventi guidano l'interfaccia utenteRiepilogo: popup dei risultatiRiepilogo: timer del popup6Salvare con JSON
JsonUtilitySalva la partitaCaricamento e valori predefinitiRiepilogo: slot di salvataggioScegli ed elimina uno slot9Pooling degli oggetti
Perché usare un pool di oggettiUn pool con una codaObjectPool di UnityRiepilogo: pool di proiettiliEsercitati da solo: Playground Unity