Que recherchez-vous ?
Engine & platform

Adressables : Planification et meilleures pratiques

JEFF RIESENMY / UNITY TECHNOLOGIESSenior Technical Product Manager
Feb 8, 2023|20 Min
Adressables : Planification et meilleures pratiques
Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.

Les jeux d'aujourd'hui sont plus grands que jamais. Alors qu'ils continuent d'explorer les limites du matériel moderne, il devient de plus en plus crucial pour les développeurs de gérer efficacement le contenu au moment de l'exécution. De plus, comme les éditeurs cherchent à optimiser les mesures de rétention et de monétisation de leurs jeux, un petit client de jeu et des mises à jour dynamiques du contenu sont devenus des exigences de base pour de nombreux jeux à succès.

Unity fournit un pipeline de bout en bout pour aider les développeurs et les éditeurs à réussir sur le marché des jeux d'aujourd'hui. Ce pipeline commence et se termine avec Addressables, un package Unity lancé en 2019 et qui alimente désormais des milliers de jeux en direct réussis et des dizaines de milliers d'autres en cours de développement.

Le paquet Addressables fournit une interface utilisateur (UI) et une API pour organiser les ressources Unity à intégrer dans les AssetBundles et à charger et décharger dynamiquement au moment de l'exécution. Que les AssetBundles soient livrés avec votre jeu de base ou qu'ils soient hébergés et livrés à partir d'un réseau de diffusion de contenu (CDN) distant tel que Cloud Content Delivery, Addressables vous aide à charger les actifs dont vous avez besoin, uniquement lorsque vous en avez besoin.

Si le système Addressables peut simplifier de nombreux aspects de la gestion du contenu, il ne s'agit pas d'une fonction "prête à l'emploi". Les choix que vous faites sur la manière d'organiser, de construire, de charger et de décharger les ressources adressables ont des conséquences importantes sur la taille et les performances de votre jeu.

Ce guide explore certains des facteurs les plus importants à prendre en compte pour tirer le meilleur parti du système Addressables. À la fin de ce blog, vous trouverez des fiches pratiques qui fournissent des paramètres généraux et des recommandations stratégiques basées sur des cas d'utilisation courants d'Addressables.

Bien entendu, la meilleure stratégie dépend du jeu que vous construisez et de vos objectifs. Considérez ce guide comme une référence à utiliser avec les documents Unity Learn, la documentation du manuel Unity et le forum communautaire pour Addressables.

Groupes d'actifs

À la base, Addressables est un outil permettant de créer et de travailler avec des AssetBundles. Avant de plonger dans l'interface utilisateur et l'API d'Addressables, il est important de se familiariser avec le format de fichier d'archive AssetBundles et certaines de ses implications en termes d'exécution.

Vous pouvez considérer les AssetBundles comme des conteneurs - ce sont des fichiers d'archive construits pour vos plateformes cibles qui peuvent contenir des actifs comme des modèles, des textures, des préfabriqués, des ScriptableObjects, des clips audio, et même des scènes entières qu'Unity peut charger au moment de l'exécution.

L'une des principales caractéristiques des AssetBundles est qu'ils peuvent exprimer des dépendances entre eux. Par exemple, l'AssetBundle 1 peut contenir un préfabriqué qui dépend d'une texture de l'AssetBundle 2. Lorsque vous utilisez Addressables pour charger le préfabriqué au moment de l'exécution, le système Addressables charge automatiquement en mémoire l'AssetBundle 2 et la texture dépendante. Et si l'AssetBundle 1 possède un autre actif qui dépend d'un actif de l'AssetBundle 3, l'AssetBundle 3 sera également chargé en mémoire, et ainsi de suite.

Diagramme de l'AssetBundle 1 et de ses dépendances avec les AssetBundles 2 et 3 de l'exemple du paragraphe ci-dessus
Diagramme de l'AssetBundle 1 et de ses dépendances avec les AssetBundles 2 et 3 de l'exemple du paragraphe ci-dessus

Lorsque votre jeu est en cours d'exécution, le système Addressables suit les références actives de tous les éléments, y compris les éléments dépendants tels que la texture évoquée ci-dessus, afin de déterminer ceux qui doivent être en mémoire. Un objet chargé à partir d'un AssetBundle ne peut pas être libéré de la mémoire tant que son nombre de références et le nombre de références de tous les autres objets du même AssetBundle ne sont pas égaux à 0. L'AssetBundle lui-même ne peut être libéré de la mémoire que lorsque tous les comptes de références d'actifs de l'AssetBundle sont à 0.

En gardant à l'esprit cette relation étroite entre Addressables et AssetBundles, la règle la plus importante pour organiser le contenu d'Addressables est de créer des AssetBundles contenant des ensembles distincts d'actifs qui seront chargés et déchargés ensemble.

Groupes de produits adressables et stratégie de regroupement

La décision la plus importante que vous prendrez probablement en utilisant Addressables est de savoir comment organiser vos actifs dans les groupes Addressables. Voici quelques questions à se poser :

  • Faut-il créer de nombreux petits groupes ou un plus petit nombre de grands groupes ?
  • Pour chaque groupe, combien d'AssetBundles devez-vous viser à générer (c'est-à-dire devez-vous emballer les actifs de ce groupe ensemble, séparément ou par étiquette) ?
  • Faut-il utiliser des étiquettes ?
  • Faut-il donner à vos groupes des chemins d'accès locaux ou distants ?

Même si nous aimerions donner une réponse unique, la meilleure stratégie de regroupement des adresses dépend de plusieurs facteurs spécifiques à votre jeu.

Rappelez-vous : Les groupes d'actifs adressables constituent la structure organisationnelle de vos actifs adressables qui détermine la manière dont ces actifs seront intégrés dans les AssetBundles. La meilleure stratégie organisationnelle sera donc celle qui permettra d'emballer, de charger et de décharger vos AssetBundles le plus efficacement possible en fonction de la structure, des objectifs et des limites propres à votre jeu.

Avant de commencer à organiser le contenu d'Addressables, assurez-vous de bien maîtriser les points suivants :

1. La structure et la feuille de route de votre jeu

2. Les points forts et les limites de la plate-forme de votre jeu

3. Votre objectif principal en utilisant Addressables pour optimiser les performances de votre jeu

Nous aborderons chacun de ces facteurs ci-dessous.

Structure du jeu et feuille de route

Le premier facteur à prendre en compte est la structure et la feuille de route de votre jeu.

Par "structure", nous entendons l'architecture réelle de votre jeu. Votre jeu est-il un parcours linéaire, à un seul joueur, où le joueur progresse à travers un ensemble prévisible de niveaux ou d'environnements ? S'agit-il d'un jeu JcJ multiplateforme avec des milliers d'objets de vanité qui pourraient être instanciés à des moments imprévisibles ? La structure de votre jeu déterminera à quel moment vous devrez avoir des ressources chargées et prêtes à être utilisées, et à quel moment vous pourrez décharger les ressources et les AssetBundles de la mémoire.

N'oubliez pas de créer des AssetBundles contenant uniquement les éléments qui doivent être chargés ensemble et qui peuvent être déchargés ensemble. Si votre jeu est un parcours linéaire avec des points d'arrêt distincts, envisagez d'organiser les groupes Addressables en sous-ensembles plus importants de contenu associés à chaque section de votre jeu. De cette façon, ces actifs peuvent être chargés et déchargés ensemble.

Si votre jeu est non linéaire et plus imprévisible, optez pour des groupes plus petits qui génèreront des AssetBundles plus petits, ce qui vous permettra de charger et de décharger de manière plus dynamique. Essayez toujours d'utiliser des noms logiques et significatifs pour vos groupes afin de vous aider à localiser rapidement les actifs et d'optimiser votre mise en page.

La "feuille de route" fait référence à la manière dont votre jeu évoluera au fil du temps. Une fois que votre jeu sera livré aux joueurs, restera-t-il pratiquement inchangé, à l'exception de corrections occasionnelles de bugs ou de correctifs d'équilibre du jeu ? Ou pensez-vous pouvoir ajouter régulièrement du nouveau contenu sans que vos joueurs aient à installer une mise à jour importante du client ?

Votre feuille de route en matière de contenu vous aide à définir votre stratégie de regroupement. Si le contenu de votre jeu est autonome et n'est pas mis à jour après le lancement, concentrez votre stratégie de regroupement autour des considérations structurelles évoquées ci-dessus. Si votre jeu nécessite des mises à jour fréquentes, regroupez votre contenu de manière à permettre aux joueurs de télécharger exactement ce dont ils ont besoin, au moment où ils en ont besoin.

Pensez à utiliser des étiquettes pour identifier le contenu de lots distincts qui seront nécessaires ensemble au moment de l'exécution, comme un ensemble d'objets cosmétiques qui s'étofferont au fil du temps, à mesure que votre jeu prendra de l'ampleur. Vous pouvez également utiliser le mode de regroupement "Regrouper par étiquette" dans vos paramètres de groupes pour subdiviser le contenu que vous avez logiquement regroupé.

Par exemple, vous prévoyez peut-être de lancer un nouvel événement "Halloween 2023" avec des objets cosmétiques à collectionner. Votre groupe "Halloween 2023 Outfits" peut contenir des actifs intitulés "Hats", "Shoes" et "Masks". Vous pouvez ensuite ajouter une étiquette "Halloween 2023" à tous les actifs de ce groupe. L'utilisation du mode de regroupement "Pack Together By Label" pour ce groupe créera trois AssetBundles au moment de la construction.

Au moment de l'exécution, vous pouvez alors charger tous les éléments adressables avec le label "Chapeaux" dans votre écran de personnalisation du personnage pour vous assurer que tous les éléments avec ce label sont téléchargés, chargés dans la mémoire et prêts à être vus par les joueurs. Vous pouvez également charger toutes les ressources adressables avec l'étiquette "Halloween 2023" sur la page de promotion de votre événement, afin de vous assurer qu'elles sont prêtes à être présentées à vos joueurs.

Image
image
Dans cet exemple simplifié, le groupe Halloween 2023 utilise le mode de regroupement "Regrouper par étiquette". Ce groupe génère les trois AssetBundles présentés. Le chargement de tous les actifs adressables avec le label "Halloween 2023" chargera les trois AssetBundles et leur contenu. Le chargement par l'étiquette "Hats" ne chargera que l'AssetBundle 1 et son contenu.

Une bonne compréhension de la structure et de la feuille de route de votre jeu vous aidera à prendre des décisions éclairées sur l'organisation de votre contenu, qui seront bénéfiques tout au long du cycle de vie de votre jeu.

Ensuite, nous aborderons les forces et les limites spécifiques de vos plateformes et ce qu'elles impliquent pour votre stratégie de contenu.

Points forts et limites de la plate-forme

Le facteur suivant à prendre en compte est les forces et les limites des plateformes que vous ciblez pour la distribution. Dans cette section, nous avons décrit les plateformes les plus courantes pour les utilisateurs d'Addressables, ainsi que certaines considérations clés pour chacune d'entre elles.

Mobile et RV

Pour les plateformes mobiles et VR, les considérations les plus importantes à garder à l'esprit sont la taille de l'application, la taille du contenu groupé et les vitesses de téléchargement.

Pour vos groupes, réfléchissez aux ensembles de contenus dont vos joueurs auront besoin immédiatement après l'installation (par exemple, pour pouvoir terminer votre didacticiel). Veillez à ce que ce contenu soit organisé en groupes avec des chemins de chargement locaux afin qu'il soit inclus dans votre jeu de base. Organisez tous les autres contenus en groupes avec des chemins de chargement distants afin de pouvoir les diffuser par voie hertzienne à vos lecteurs.

Optez pour une stratégie de groupe qui permettra de constituer des AssetBundles relativement petits. L'équilibre exact dépendra de votre jeu. Évitez les paquets très volumineux qui consommeront une quantité substantielle de mémoire et seront difficiles à libérer une fois chargés. De même, évitez un grand nombre de petits paquets qui pourraient créer un très gros fichier de catalogue Addressables qui sera téléchargé à chaque mise à jour du contenu. De nombreuses offres groupées peuvent également avoir un impact sur la vitesse à laquelle vos joueurs peuvent télécharger le contenu dont ils ont besoin, alors tenez compte de ces avantages et inconvénients lorsque vous déterminez le bon équilibre pour votre jeu.

Ordinateurs de bureau et consoles

Pour les ordinateurs de bureau et les consoles, la considération la plus importante est la performance. Par rapport aux appareils mobiles et au matériel de RV sans fil, le matériel de bureau et de console présente généralement moins de contraintes en matière de mémoire et de stockage sur disque. Dans cette optique, il convient d'envisager un paramètre de groupe qui permettra de créer des AssetBundles non compressés. Cela permet d'obtenir le temps de chargement le plus rapide possible et peut même permettre d'appliquer des correctifs de manière efficace sur certaines plates-formes.

Lors du développement pour les consoles, il convient d'être attentif aux éventuelles restrictions de mise en cache spécifiques à la plate-forme. Alors que les plateformes mobiles vous permettent de profiter du cache AssetBundle d'Unity pour le contenu téléchargé, cette fonctionnalité est désactivée par défaut au niveau du moteur Unity pour certaines consoles et le WebGL. Envisagez de mettre à jour votre jeu de base avec le nouveau contenu de ces plateformes plutôt que d'essayer de fournir du contenu à distance par voie hertzienne. Dans le cas contraire, vous devrez créer votre propre système de mise en cache d'AssetBundle et déterminer si votre solution est conforme aux conditions de service de ces plateformes.

Déterminer les objectifs principaux

Après avoir évalué les forces et les limites de vos plateformes cibles, identifiez un ou deux objectifs principaux que vous essayez d'atteindre en utilisant le système Addressables. Par exemple : Cherchez-vous principalement à réduire la taille de votre jeu de base ou prévoyez-vous de fournir aux joueurs des mises à jour de contenu en direct ? Pour illustrer notre propos, nous allons examiner ces options, et d'autres encore, en détail ci-dessous.

Minimiser la taille du jeu de base

Si votre objectif principal est de réduire la taille de votre jeu de base, et que vous n'êtes pas préoccupé par les limitations de mémoire ou les téléchargements importants après l'installation, alors votre objectif principal devrait être de migrer autant de ressources que possible des scènes et des ressources vers un ou plusieurs groupes adressables avec des chemins de chargement distants.

Envisagez de rendre les scènes de votre projet adressables et déterminez lesquelles, le cas échéant, doivent être incluses dans la construction du lecteur principal. Pour celles qui peuvent être livrées aux joueurs après l'installation, inclure ces scènes dans des groupes avec des chemins de chargement distants. Vous pouvez même construire un joueur avec une scène presque vide, et charger le reste de votre jeu dynamiquement à partir de là, comme l'explique cette vidéo du Devlog d'Open Projects.

Diagramme du contenu hypothétique d'un projet qui ne comprend qu'une scène "Initialisation" intégrée au jeu de base, avec deux scènes de jeu principales, "Plage" et "Forêt", emballées dans des AssetBundles à charger en cas de besoin, et un certain nombre d'autres AssetBundles pour les actifs qui seront nécessaires dans plusieurs scènes.

Si vous rendez certaines scènes adressables, il est préférable de les rendre toutes adressables afin de réduire le risque et le volume de duplication inutile des actifs.

Pour les groupes qui génèrent des AssetBundles destinés à être hébergés à distance, veillez à activer l'AssetBundle Cache. Ce paramètre garantit que les AssetBundles téléchargés seront mis en cache sur les appareils de vos joueurs, ce qui leur évitera d'avoir à les télécharger à nouveau à chaque session.

S'il est toujours bon de garder à l'esprit les implications en termes de temps d'exécution d ' un grand nombre de petits paquets par rapport à un petit nombre de gros paquets, ces considérations deviennent plus pertinentes lorsque l'on considère d'autres objectifs que l'on peut avoir.

Diffusion efficace de contenus à distance aux joueurs

Si votre objectif principal est la diffusion efficace de contenu distant, la structure de votre groupe doit refléter la manière dont vous souhaitez répartir le contenu entre le contenu " local " (c'est-à-dire les ressources incluses dans votre lecteur) et le contenu " distant " (c'est-à-dire les ressources hébergées sur un réseau de diffusion de contenu externe). Une fois encore, veillez à activer le cache AssetBundle pour mettre en cache le contenu téléchargé sur les appareils des joueurs.

La taille, le nombre et le mode groupé de ces groupes dépendront du moment où vous prévoyez de fournir du contenu à distance à vos joueurs et du temps que vous êtes prêt à leur faire attendre pour que les téléchargements soient terminés. Par exemple, si la structure de votre jeu permet la livraison de tout le contenu distant peu après l'installation du jeu de base, vous pouvez opter pour des groupes plus importants avec Pack Together ou Pack Together By Label, ce qui se traduira par un petit nombre de téléchargements importants.

Si vous prévoyez de fournir des ensembles plus petits de contenu distant aux joueurs tout au long de leurs sessions, ce qui perturbera moins l'expérience, vous pouvez opter pour des groupes plus petits et/ou un paramètre de mode de regroupement qui génèrera des AssetBundles plus petits qui se téléchargeront beaucoup plus rapidement.

Dans la plupart des cas, pour les groupes contenant du contenu distant, envisagez d'activer l' option Cyclic Redundancy Check (CRC) , Excluding Cached, pour votre AssetBundle. Cela permet de mieux garantir l'intégrité de votre contenu distant lorsqu'il est mis en cache sur les appareils des joueurs, tout en évitant les frais généraux supplémentaires liés à l'exécution d'un CRC pour le chargement du contenu qui se trouve déjà sur les appareils des joueurs.

Optimisation de l'utilisation de la mémoire d'exécution et des performances

Si votre objectif principal est d'optimiser les performances d'exécution du jeu et l'utilisation de la mémoire, n'oubliez pas la règle la plus importante de l'organisation des groupes d'adressables : Les biens que vous prévoyez de charger et de décharger en même temps doivent être regroupés.

D'une manière générale, il s'agira de créer des AssetBundles plus petits. Vous pouvez y parvenir de plusieurs façons, notamment en créant des groupes plus petits et/ou en évitant le mode " Pack Together" dans vos paramètres de groupe pour les grands groupes qui contiennent des ressources qui ne seront pas toujours utilisées en même temps dans votre jeu.

Vous devez également garder un œil sur les performances d'exécution pour vous aider à repérer les problèmes potentiels ou les domaines d'optimisation. Tirez parti des outils officiels d'Unity tels que Unity Profiler, Memory Profiler ou Addressables Event Viewer, qui peuvent tous vous aider à optimiser les performances de votre jeu.

Soyez à l'affût du prochain module Addressables Profiler, qui remplacera l'Addressables Event Viewer. Ce nouvel outil fournira des informations encore plus détaillées sur la façon dont votre code charge et décharge les actifs adressables et les AssetBundles, y compris des informations détaillées sur les dépendances entre vos actifs et vos AssetBundles.

Objectifs multiples

Bien entendu, la plupart des projets auront un certain nombre d'objectifs associés à Addressables. Dans ce cas, il n'y a pas vraiment d'approche unique. Vous devrez évaluer les compromis décrits ci-dessus et trouver la structure et les paramètres du groupe qui vous permettront d'atteindre le succès que vous avez défini.

Nous vous recommandons de tirer parti du rapport de construction d'Addressables et du module de profilage d'Addressables, qui seront bientôt disponibles dans Addressables 1.21.3. Le rapport Addressables Build Report vous fournira des informations détaillées sur les AssetBundles qui ont été générés à partir de vos builds Addressables, y compris la taille du fichier, les doublons potentiels et des informations approfondies sur les dépendances. Le module Addressables Profiler est un nouvel outil d'analyse de la durée d'exécution qui tire parti de ces nouvelles données sur les dépendances, en fournissant des informations précises sur ce qui a été chargé par votre code Addressables et sur les raisons de ce chargement.

Échelles d'évaluation : Cas d'utilisation courants

Vous trouverez ci-dessous des fiches pratiques sur les paramètres et stratégies recommandés pour Addressables en fonction des cas d'utilisation les plus courants. Bien entendu, il ne s'agit que de suggestions - c'est à vous de déterminer si une suggestion correspond à la structure unique de votre projet et à vos objectifs spécifiques.

Si vous avez des questions ou si vous souhaitez en savoir plus sur l'offre Addressables, rendez-vous sur le forum Addressables. Vous pouvez également me contacter directement sur Twitter à l'adresse @Unity_Jeff. Ne manquez pas les nouveaux blogs techniques d'autres développeurs Unity dans le cadre de lasérie permanente Tech from the Trenches.