Bonjour,
Je rencontre un petit problème en utlisant XNA (cependant mon problème est relatif au C#!).
Je souhaite écrire un gestionnaire d'images, qui contiendrait une bibliothèque de texture et qui renverrait des références vers les images dès qu'un objet en demande une. En clair : je veux éviter la duplication d'images en mémoire.
Mon TextureManager contient un dictionnaire liant string et Texture2D. A chaque demande, le gestionnaire vérifie si le nom de l'image est connu, auquel cas il renvoie l'image correspondante, sinon il la charge, l'ajoute à la bibliothèque et la renvoie.
Un appel à la fonction GetTexture :
La définition de la fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 texture = textureManager.GetTexture(assetName);
Pour tester, j'ai crée 1000000 sprites que j'ai lié à une image via le texture manager. D'un autre côté, j'ai créé le même nombre de sprites en chargeant à chaque fois l'image d'une manière "classique".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public Texture2D GetTexture(string assetName) { if (texturesBank.ContainsKey(assetName)) return texturesBank[assetName]; else { texturesBank.Add(assetName, content.Load<Texture2D>(assetName)); return texturesBank[assetName]; } }
Le problème c'est que les performances sont meilleures avec la méthode classique : environ 130mo d'utilisation de la mémoire contre environ 160 mo pour la version utilisant le TextureManager.
En cherchant d'ou venait le problème, je me suis dit que la ligne suivante :
ne stockait peut être pas une référence vers l'image de la bibliothèque du texture manager mais bien directement la texture. Après le chargement des images et avant leur affichage à l'écran, j'ai donc vidé la bibliothèque d'images. Ainsi, elles n'auraient pas du s'afficher à l'écran puisqu'elles n'existeraient plus en mémoire... Le problème c'est que l'affichage ne pose pas de problèmes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 texture = textureManager.GetTexture(assetName);
Voila donc ma question, comment m'assurer que mon TextureManager retourne bien une référence vers chaque image plutôt que de retourner les objets images?
Merci,
Partager