我正在创建一些东西,需要我加载相当多的纹理(使用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"]
来抓取我想要的纹理。
我的问题是:这是一个非常低效的系统吗?我只是想重新发明轮子?我是否应该回到拥有大量变量来存储我的纹理,还是有更好的选择?
答案 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;
}
}
我不确定这种方法有多高效,但对我来说最有意义。