XNA – Content.Load : Caching or not Caching ?

Quand j’ai commencé XNA, l’une des premières questions que je me suis posée, c’est “mais ça fait quoi si je fais ça?”:

Texture2D maTexture = Content.Load<Texture2D>("matexturequitue");

// Ca crée une nouvelle texture ça ? 
Texture2D maTextureEncore = Content.Load<Texture2D>("matexturequitue");

 

Du coups j’ai cherché un petit peu sur le net et j’ai trouvé quelques réponses du type “Oui t’inquiètes pas ça met en cache”, “ouais c’est magique t’inquiète pas!”

Comme j’aime pas trop la magie (enfin en développement en tout cas ^^), j’ai regardé de plus prêt, et du coups je partage, dès fois que ça puisse servir à quelqu’un d’autre.

Voici ce qu’on trouve en décompilant la méthode Load<>(string) du ContentManager :

public virtual T Load<T>(string assetName)
        {
            object[] objArray;
            object obj = null;
            T t;
            if (this.loadedAssets == null)
            {
                throw new ObjectDisposedException(this.ToString());
            }
            if (string.IsNullOrEmpty(assetName))
            {
                throw new ArgumentNullException("assetName");
            }
            assetName = TitleContainer.GetCleanPath(assetName);

            // /!\ On a la réponse à notre question ici /!\ 
            if (this.loadedAssets.TryGetValue(assetName, ref obj))
            {
                if (!obj as T)
                {
                    throw new ContentLoadException(
                    string.Format(CultureInfo.CurrentCulture,
                                    FrameworkResources.BadXnbWrongType,
                                    new object[] { assetName, obj.GetType(),
                                        typeof(T) }));
                }
                return (T)obj;
            }
            Logger.BeginLogEvent(LoggingEvent.LoadContent,
                string.Concat("XNA: Begin Loading Content: ",
                assetName));
            try {
                t = this.ReadAsset<T>(assetName, null);
                this.loadedAssets.Add(assetName, t);
            }
            finally {
                Logger.EndLogEvent(LoggingEvent.LoadContent,
                    string.Concat("XNA: Done Loading Content: ",
                    assetName));
            }
            return t;
        }

On voit donc bien que le ContentManager stocke les différents Assets chargés dans un Dictionnary<string, object>.

Si l’asset est déjà présent dans le dictionnaire il renvoi directement la référence de l’asset présent dans le dictionnaire

Sinon il le charge l’ajoute au dictionnaire et renvoi la référence qui viens d’être ajoutée.

One comment on “XNA – Content.Load : Caching or not Caching ?

1 Pings/Trackbacks for "XNA – Content.Load : Caching or not Caching ?"

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>