[CF-AL] Eviter les fuites de mémoire

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

[CF-AL] Eviter les fuites de mémoire

Message par Jayme65 » 24 Nov 2017 15:52

Bonjour,

Si l'on veut par exemple centraliser le téléchargement d'images dans une méthode, quelque chose de ce genre:

Code : Tout sélectionner

protected Texture2D LoadPNG(string filePath)
{
 if (File.Exists(filePath))
     {
         fileData = File.ReadAllBytes(filePath);
         Texture2D tex2 = new Texture2D(1, 1, TextureFormat.ARGB32, false);
         tex2.filterMode = FilterMode.Point;
         tex2.wrapMode = TextureWrapMode.Clamp;
         tex2.LoadImage(fileData);
         return tex2;
     }
     return null;
  }
...je me rends compte dans le profiler que si je charge dans le temps plusieurs images différentes pour le même game object, la 'nouvelle' texture certes remplace l'ancienne (visuellement) mais d'un point de vue mémoire et nombre de textures (puisqu'on peut voir ces informations dans le profiler) elles viennent en fait s'empiler...et donc l'occupation mémoire peut gonfler très rapidement!

On peut alors décider de déclarer une fois pour toute une texture (pour éviter de déclarer de nouvelles, dans la méthode, à chaque passage)

Code : Tout sélectionner

Texture2D tex2 = new Texture2D(1, 1, TextureFormat.ARGB32, false);

protected Texture2D LoadPNG(string filePath)
{
 if (File.Exists(filePath))
     {
         fileData = File.ReadAllBytes(filePath);
         tex2.filterMode = FilterMode.Point;
         tex2.wrapMode = TextureWrapMode.Clamp;
         tex2.LoadImage(fileData);
         return tex2;
     }
     return null;
  }
...et en effet, vu qu'il s'agit maintenant d'un 'recyclage' d'une seule et même texture, l'occupation mémoire reste stable...mais si des games objets différents ont fait appel à cette méthode, ils partagent maintenant tous la même texture!

Ma question est la suivante: si l'on a un nombre X de game objets, créés dynamiquement et susceptibles d'utiliser cette méthode pour charger chacun des images différentes (ET qui peuvent s'updater dans le temps) quelle est donc la bonne façon de faire pour que l'utilisation de la mémoire ne s'envole pas plus qu'elle ne devrait? Doit-on créer autant de Texture2D qu'il y a de game objects?

Merci!

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

Re: [CF-AL] Eviter les fuites de mémoire

Message par boubouk50 » 24 Nov 2017 16:33

Salut,
A tester, pour relâcher la mémoire il faudrait mettre tex2 à null. Par contre, comment le faire puisqu'elle est renvoyée... :0
Tu as aussi: Resources.UnloadUnusedAssets()

EDIT - http://wiki.unity3d.com/index.php?title=DetectLeaks. Ça peut aider à profiler je suppose. (pas testé)
"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 « (C#) CSharp »