XNA Texture2D缓存

4
这样的类是否必要?
public class ContentCache
{
    private readonly ContentManager _content;
    private readonly Dictionary<string, Texture2D> _textureCache = new Dictionary<string, Texture2D>();

    public ContentCache(ContentManager content)
    {
        _content = content;
    }

    public Texture2D Load(string assetName)
    {
        Texture2D texture = null;
        if (!_textureCache.TryGetValue(assetName, out texture))
        {
            _textureCache[assetName] =
                texture = _content.Load<Texture2D>(assetName);
        }
        return texture;
    }
}

我想知道ContentManager.Load<Texture2D>()是否在其内部进行缓存。我不想重复缓存。

注意:

我们的XNA游戏是2D游戏,将在WP7和Windows上运行,并使用MonoGame在iOS和OSX上运行。

MonoGame在Windows中可能与XNA功能不同,但我可以浏览它的源代码来找出答案。


1
这是一个很好的问题。事实证明,我为了同样的原因几乎写了一个完全相同的类。很高兴根据你得到的答案知道它不再需要了。 - Bradley Uffner
3个回答

4
这个类是不必要的。ContentManager会替您完成这项工作。
来源:

http://forums.create.msdn.com/forums/p/31383/178975.aspx

注意:
就 Mono 而言……我相信两个实现非常相似,但在这种情况下我不能确定。
另外,如果你想重新加载一个资源,你可以使用一个额外的 ContentManager 然后丢弃它。

根据MonoGame的情况,我们可能会保留它。我会检查一下它的源代码并回复。 - jonathanpeppers
1
MonoGame似乎没有缓存任何内容文件:https://github.com/mono/MonoGame/blob/master/MonoGame.Framework/Content/ContentManager.cs,因此我认为我们将使用这个类和一些`#if MONOGAME`预处理器语句,在常规XNA上不使用缓存。 - jonathanpeppers
MonoGame绝对应该像Xna框架一样缓存资产。如果还没有这样做,为什么不在ContentManager中实现它呢?请参考此线程以获取一些基本代码:http://monogame.codeplex.com/discussions/273478 - Aranda
链接的源代码已经失效,需要更新。 - itsme86

1
需要翻译的内容:

需要注意的是,Mono类ContentManager现在也进行缓存。

此功能于2012年添加。供将来参考。


0

在第一个LoadContent方法中,只需缓存需要缓存的内容,可以使用一些预缓存字符串数组,例如:

// Preload assets
static readonly string[] preloadAssets =
{
     "Textures\\texture1",
};

protected override void LoadContent()
{
    foreach ( string asset in preloadAssets )
    {
        Content.Load<object>(asset);
    }
}

或许是这样的东西!


这不是我问题或类的意图。我觉得你对问题有点误解。我的类是惰性加载纹理,并且如果再次请求它们,则会将其缓存起来。 - jonathanpeppers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接