1

我正在创建一些需要加载大量纹理的东西(使用 XNA 的 Texture2D),并且我一直在使用一种使管理它们稍微容易一些的方法(因为我不断更改纹理的名称等)。

我目前的代码如下:

public static Dictionary<String, Texture2D> textureList = new Dictionary<string, Texture2D>();

public void AddTexture(String title)
{
    Texture2D texture = Content.Load<Texture2D>(title); // This is just XNA's way of loading a texture
    textureList.Add(title, texture);

    Console.WriteLine("Texture bounds: " + textureList["ImageTitle"].Bounds); // AN example of the texture system being used
}

现在,AddTexture("Sprinkler");当我希望添加新纹理并且(如示例中所示)我textureList["ImageTitle"]用来抓取我想要的纹理时,这让我可以简单地执行此操作。

我的问题是:这是一个非常低效的系统,我只是想重新发明轮子吗?我应该回到拥有大量变量列表来存储我的纹理,还是有更好的选择?

4

3 回答 3

2

我的问题是:这是一个非常低效的系统,我只是想重新发明轮子吗?我应该回到拥有大量变量列表来存储我的纹理,还是有更好的选择?

字典不是低效的。从字典中获取是一个相对较快的操作。

最大的缺点是你失去了编译时的安全性(如果你输入了错误的名字,这将是一个运行时错误,而不是编译时错误),但除此之外,这是一种非常常见的好方法。对于您将在代码中硬编码的定期获取和使用的项目,我建议使用常量来保存名称,而不是重复字符串文字。

这为您提供了在适当时使用的不错的“变量”,但可以灵活地根据需要添加额外的项目,而无需更改代码。

于 2013-09-26T19:35:39.920 回答
0

我认为使用字典来查找纹理(加载时)是一个好主意,但我认为你不应该在渲染过程中使用名称来查找纹理,只查找它,然后保存对它的引用,所以你渲染时可以直接使用。

在加载时,您可以创建类似缓存的内容:

Texture2D texture;

if(!textureList.TryGetValue(title, out texture))
{
    texture = Content.Load<Texture2D>(title);
    textureList.Add(title, texture);
}

MyNewLoadedMesh.Texture = texture;
于 2013-09-26T19:35:30.683 回答
0

就个人而言,我创建了一个Manager<T>类,它基本上是两个字典对象的包装器,对象 T 由 ID 号和名称索引。一个天真的实现看起来像:

public class Manager<T>
{
    private Dictionary<int, T> IndexByID;
    private Dictionary<string, T> IndexByName;

    public T this[int index]
    {
        get { return this.IndexByID[index]; }
    }

    public T this[string index]
    {
        get { return this.IndexByName[index]; }
    }

    public void Add(int id, string name, T value)
    {
        this.IndexByID[id] = value;
        this.IndexByName[name] = value;
    }
}

我不确定这种方法的效率如何,但它对我来说最有意义

于 2013-09-26T20:01:47.117 回答