字典与变量列表

时间:2013-09-26 19:30:57

标签: c# xna

我正在创建一些东西,需要我加载相当多的纹理(使用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"]来抓取我想要的纹理。

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

3 个答案:

答案 0 :(得分:2)

  

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

字典效率不高。从字典中获取是一个相对快速的操作。

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

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

答案 1 :(得分:0)

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

加载时你可以创建类似缓存的东西:

Texture2D texture;

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

MyNewLoadedMesh.Texture = texture;

答案 2 :(得分: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;
    }
}

我不确定这种方法有多高效,但对我来说最有意义