我想知道在列表中查找项目索引的最快方法是什么。我想知道的原因是因为我正在进行XNA渲染,但是当我只使用顶点缓冲区时,我开始在大型模型上出现内存异常,所以我现在已经实现了一个索引缓冲系统。我的问题是,我现在必须不断扫描包含我所有Vector3的列表,以获取我希望在索引缓冲区中放置的索引。我目前正在扫描这样的指数:
for (int i = 1; i < circleVect.Length; i++)
{
indices.Add(vertices.FindIndex(v3 => v3 == circleVect[i]));
indices.Add(vertices.FindIndex(v3 => v3 == circleVect[i - 1]));
indices.Add(vertices.FindIndex(v3 => v3 == middle));
}
除了它相当慢的事实外,这种方法很好。计算一个气缸需要将近1秒钟,我的大型模型中有超过70 000个气缸。因此,在加载我的大型模型时,我已经看到加载屏幕超过20分钟,但仍未完成。遗憾的是,这是不可接受的。如果我尝试加载我的小型模型需要5分钟以上,而未加索引的加载器只需要一秒左右。
我绝对没有接受过C#的正式培训,更不用说XNA了,所以我知道这可能是计算索引的一种非常低效的方式,所以如果你们中的任何人能够帮助我创建一个更高效的进口商,我将非常感激。
PS。如果有必要,我可以将列表更改为数组,但这将是最后的选择,因为它可能会给系统内存带来压力(导致异常)并且对我来说意味着相当多的编码。
答案 0 :(得分:0)
在你的代码中,每个FindIndex行循环遍历顶点3次。而是使用一个for循环并遍历并在1 go中检查所有三个条件。
答案 1 :(得分:0)
for (int i = 1; i < circleVect.Length; i++)
{
for (int j = 0; j < vertices.Count; j++)
{
var v3 = vertices[j];
if (v3 == circleVect[i] || v3 == circleVect[i - 1] || v3 == middle)
indices.Add(j);
}
}
您可能需要考虑添加逻辑以在找到所有三个索引后停止检查内部循环。
答案 2 :(得分:0)
你的主要表现杀手是在一份包含7万件作品的70 000件物品清单中搜寻。 这比在列表中搜索要快得多。
Dictionary<int, Vertice> vertices = new Dictionary<int, Vertice>();
for (int i = 1; i < vertices.Length; i++)
{
if (vertices.ContainsKey(vertices[i]))
{
indices.Add(vertices[i]);
}
if (vertices.ContainsKey(vertices[i - 1]))
{
indices.Add(vertices[i - 1]);
}
if (vertices.ContainsKey(vertices[middle]))
{
indices.Add(vertices[middle]);
}
}
编辑:如果在列表中搜索需要2秒,则在字典中搜索将需要00:00:02秒
答案 3 :(得分:0)
感谢所有的答案,但没有一个真正有效,并且真的比我的速度更快。我最终必须创建一个结构,我可以根据给定的参考点计算所需的列表索引。