Pourquoi mettre les objets en pool
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 46 sur 64.
Une arme qui tire 10 balles par seconde pendant une minute appelle Instantiate 600 fois et Destroy 600 fois. Chaque Instantiate copie le prefab avec tous ses composants et exécute leur Awake, OnEnable et Start. Chaque Destroy exécute OnDisable et OnDestroy et laisse la mémoire de l’objet derrière lui sous forme de déchets. Le ramasse-miettes de C# libère cette mémoire plus tard, et son travail se produit sur certaines images et pas sur d’autres, ce qui se traduit par des saccades, particulièrement sur les téléphones moins rapides.
Un pool conserve les objets au lieu de les détruire. Une balle tirée est désactivée avec SetActive(false) et retourne dans le pool ; le tir suivant en récupère une et l’active, et Instantiate ne s’exécute que lorsque le pool est vide. Après les premières secondes de tir, les tirs ne créent rien de nouveau et ne laissent aucun déchet. Lors de la réutilisation, Awake et Start ne s’exécutent pas à nouveau : ils se sont exécutés une fois, à la création de l’objet. Tout ce qui doit être réinitialisé à chaque utilisation, comme un minuteur, la santé ou une vitesse, est réinitialisé dans OnEnable ou par le code qui récupère l’objet.
La mise en pool est utile pour les objets qui sont souvent créés puis éliminés : les balles, les étincelles, les nombres de dégâts, les ennemis d’un jeu à vagues. Elle n’est pas utile pour un boss qui apparaît une seule fois ou un menu qui s’ouvre de temps en temps. Un pool conserve en permanence la mémoire de ses objets inactifs ; il garde donc un nombre raisonnable d’objets et libère les autres.
Essayez vous-même
Cette leçon ne comprend pas de défi de code.
Toutes les leçons de Architecture de jeu dans Unity
1Des composants, pas des hiérarchies
De petits composantsUn script de base pour les ennemisComposants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaireRécapitulatif : canon double4Données sérialisées
Classes sérialisablesListes dans l’InspecteurÉnumérations dans l’InspecteurRécapitulatif : table de butinRécapitulatif : tirer le butin2Les interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interactionLe plus proche à portée5ScriptableObjects
Ressources de donnéesStatistiques des armesParamètres partagésSauver le ventLes vagues comme donnéesRécapitulatif : base de données des objetsRécapitulatif : acheter dans la boutique3Événements
Les événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interfaceRécapitulatif : fenêtre de succèsRécapitulatif : minuteur de la fenêtre6Sauvegarder avec JSON
JsonUtilitySauvegarder la partieCharger et valeurs par défautRécapitulatif : emplacements de sauvegardeChoisir et supprimer un emplacement9Réutilisation des objets
Pourquoi mettre les objets en poolUn pool avec une fileObjectPool de UnityRécapitulatif : pool de projectilesEntraînez-vous par vous-même : Playground Unity