Pourquoi mettre les objets en pool
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 37 sur 50.
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.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Architecture de jeu dans Unity
1Des composants, pas des hiérarchies
Des composants simplesUn script de base pour les ennemisDes composants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaire4Données sérialisées
Classes sérialisablesListes dans l’inspecteurÉnumérations dans l’inspecteurRécapitulatif : table de butin7Machines à états
Les états sous forme de classesUne machine à étatsTransitionsLes cerveaux des ennemisRécapitulatif : états d’une porte10Projet : Survivant de l’arène
Le hérosTypes d’ennemis2Interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interaction5ScriptableObjects
Assets de donnéesStatistiques des armesParamètres partagésLes vagues sous forme de donnéesRécapitulatif : base de données d’objets3Événements
Événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interface utilisateurRécapitulatif : fenêtre contextuelle de succès6Sauvegarder avec JSON
JsonUtilitySauvegarder le jeuCharger et valeurs par défautRécapitulatif : emplacements de sauvegarde9Réutilisation des objets
Pourquoi mettre les objets en poolUn pool avec une fileObjectPool de UnityRécapitulatif : pool de projectiles