0

我想知道在列表中查找项目索引的最快方法是什么。我想知道的原因是因为我正在制作 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。如有必要,我可以将列表更改为数组,但这将是最后的选择,因为它可能会给系统内存带来压力(导致异常),并且对我来说意味着相当多的编码。

4

4 回答 4

0

感谢所有答案,但它们都没有真正起作用,而且看起来确实比我所拥有的更快。我最终不得不创建一个结构,我可以在其中根据给定的参考点计算所需的列表索引。

于 2013-06-09T05:56:11.693 回答
0

在您的代码中,对于每个 FindIndex 行,您将遍历顶点 3 次。而是使用一个 for 循环并遍历并在 1 次中检查所有三个条件。

于 2013-06-07T15:44:24.293 回答
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);
    }
}

You may want to consider adding logic to stop the inner loop from checking after all three of the indexes have been found.

于 2013-06-07T15:52:17.493 回答
0

您的主要性能杀手是在需要 70 000 次操作的 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 秒

于 2013-06-07T15:54:12.417 回答