AssetBundle.Unload(false) consomme en mémoire

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
calypsomen
Messages : 45
Inscription : 26 Mars 2019 16:39

AssetBundle.Unload(false) consomme en mémoire

Message par calypsomen » 23 Avr 2020 09:46

Bonjour à tous,

Etant débutant dans l'utilisation des AssetBundle, je me permet de solliciter votre aide concernant l'utilisation de AssetBundle.Unload.
J'utilise une coroutine qui a pour but de charger les objets de la scène (tous les objets : mobilier, constructions, maisons doivent être chargés dynamiquement, donc les AssetBundle semblent être une bonne solution).

Code : Tout sélectionner

IEnumerator GetObjectCor(string categ, string objName)
    {
        var bundleLoadRequest = AssetBundle.LoadFromFileAsync(Path.Combine(Application.streamingAssetsPath, categ));
        yield return bundleLoadRequest;

        var myLoadedAssetBundle = bundleLoadRequest.assetBundle;
        if (myLoadedAssetBundle == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            loadedObject = null;
            objectSearching = false;
            myLoadedAssetBundle.Unload(true);
            yield break;
        }

        var assetLoadRequest = myLoadedAssetBundle.LoadAssetAsync<GameObject>(objName);
        yield return assetLoadRequest;

        if (assetLoadRequest != null && assetLoadRequest.asset != null)
            loadedObject = assetLoadRequest.asset as GameObject;
        else
            loadedObject = null;

        myLoadedAssetBundle.Unload(false);
        objectSearching = false;
    }
J'ai ainsi une trentaine de catégories de GameObject ( Apartment, Furniture, Street... ) pour pouvoir construire sa map via un éditeur en jeu. J'ai actuellement plus de 800 objets enregistrés dans ma base de donnée mais lorsque le chargement des objets se fait, la consommation de mémoire augmente petit à petit jusqu'à saturation.

Après quelques tests et renseignements, j'en ai conclu que c'était à cause de myLoadedAssetBundle.Unload(false); et qu'il était préférable d'utiliser myLoadedAssetBundle.Unload(true); mais lorsque je l'utilise, tous les objets créés disparaissent étant donné que les objets déjà créés sont également unload.

Etant donné que j'ai un gros nombre d'objets à charger à l'initialisation + les assetbundle à charger durant l'utilisation du map editor (lien ci dessous), je ne vois pas vraiment comment optimiser cela efficacement. Peut-être est-ce possible avec Unload(true) mais comment pourrais-je faire?

map editor : https://www.zupimages.net/up/20/17/ps6o.png

Je souhaiterai donc trouver une solution grâce à vous, je vous remercie par avance pour votre aide!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: AssetBundle.Unload(false) consomme en mémoire

Message par boubouk50 » 23 Avr 2020 10:31

Salut,

La documentation est très claire à ce sujet:
False: décharge le bundle
True Décharge le bundle et supprime tous les assets chargés.
Tu ne peux donc pas utiliser myLoadedAssetBundle.Unload(true); sans supprimer tout ce que tu as mis dans ta scène.

Concernant la mémoire, tu charges 800 objets, cela est normal qu'elle augmente. Entre les meshs, les textures et les matériaux, ça fait déjà pas mal. Pour moi, l'optimisation passe par là.
Une idée pour tester, fous-les tous dans une scène et regarde la mémoire pour comparer.

Enfin, le Bundle ne devrait être chargé qu'une seule fois puis la recherche d'objet à l'intérieur se fait dans ce bundle chargé. Ici, j'ai l'impression que tu le charges à chaque recherche d'objet, tu imagines à la fin tu te retrouves avec beaucoup de données venant de partout.
Disons-le différemment, tu as une bibliothèque remplie de livres. Des clients font la queue pour récupérer un ou plusieurs livres. Tu vas te servir d'une seule bibliothèque, toujours la même et tout le monde repart avec sa commande.
Ici, à chaque demande, c'est comme si tu donnais la bibliothèque entière avec le livre à l'intérieur. Pour chaque demande de livre. A la fin, tu te retrouves avec X bibliothèques au lieu de X livres. C'est pas la même taille.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

calypsomen
Messages : 45
Inscription : 26 Mars 2019 16:39

Re: AssetBundle.Unload(false) consomme en mémoire

Message par calypsomen » 24 Avr 2020 09:34

Je vous remercie pour votre aide, j'ai donc regroupé tous les assetbundle en 1 seul pour ne charger uniquement que celui-ci et le laisser chargé durant toute les manipulations dans le map editor.
Mais l'assetbundle fait désormais plus de 7Go, je ne sais pas si ça pose problème?
Cependant quand j'essaye de charger dans ce nouvel assetbundle, j'ai ce problème :

Image

Le panneau de gauche a été glissé dans la scène (c'est l'asset que j'utilise dans le bundle) et celui de droite est chargé via l'assetbundle (il s'agit du même panneau).
J'ai bien rebuild les bundles, donc je ne comprend pas ce qui se passe :triste1:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: AssetBundle.Unload(false) consomme en mémoire

Message par boubouk50 » 24 Avr 2020 10:51

On s'est mal compris, je n'ai pas dit de n'utiliser qu'un seul AssetBundle, mais de ne les charger qu'une seule fois. Après, qu'ils soient séparés ou non, c'est une question d'agencement et d'organisation plus qu'autre chose.
De ce que je lis, garder les AssetBundles en mémoire n'est pas critique car les données sont compressées. Là, ou cela devient plus lourd, ce sont les instanciations des données internes puisque décompressées.

7Go de données compressées, c'est déjà lourd. C'est normal que les charger prenne autant de mémoire et encore plus lors de l'instanciation.
Comme dit, regarde à l'optimisation des ressources, notamment au niveau des textures (éviter d'avoir des textures trop grosses pour rien), ensuite des meshs (optimiser le nombre de polygones) puis la réutilisation des matériaux (utilisation d'Atlas de textures).
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

calypsomen
Messages : 45
Inscription : 26 Mars 2019 16:39

Re: AssetBundle.Unload(false) consomme en mémoire

Message par calypsomen » 24 Avr 2020 13:28

Merci pour votre réponse rapide,

Etant donné que je dois garder les objets chargés en permanence pour les utiliser à n'importe quel moment, ne serait-ce pas plus efficace d'utiliser Resources ? Comme ça je peux Resources.LoadAsync l'asset et Resources.UnloadUnsetAssets.
C'est peut-être plus optimisé plutôt que de garder des assetbundle en mémoire?
Est-ce possible de cette façon ? Et est-ce que les ressources peuvent supporter un aussi grand nombre d'assets (approximativement 5000 objets)

Je vous remercie pour votre aide!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6216
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: AssetBundle.Unload(false) consomme en mémoire

Message par boubouk50 » 24 Avr 2020 13:42

Je ne pense pas qu'il y ait de limites de stockage pour les Resources.
L'avantage des AssetBundles étant de ne pas être contenus dans le programme, cela l'allège nettement.
Je ne voudrais pas t'induire en erreur, il va falloir creuser un peu pour voir ce qui est préférable pour ton problème.
Tu as des liens comme celui-ci qui te donnent ces informations.
https://blogs.unity3d.com/2017/04/12/as ... -showdown/

Après, cela devient une question d'agencement du code, pour limiter l'utilisation mémoire. Comme l'utilisateur ne va pas utiliser tous les assets du Bundle, ce pourrait être intéressant d'avoir un bundle qui ne contient que les icônes des objets pour l'affichage du menu. Et plein d'autres organisés par catégorie, ou autrement. Là, c'est une question que je ne peux étudier pour toi.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »