繁体   English   中英

在转换为浮点数组的点列表中获取 BoundingBox 的最快方法

[英]Fastest way to get BoundingBox in a list of Points which is converted into a float array

我有一个非常非常长的点列表(最多 10,000,000),然后将其转换为列表以获得更快的性能。

结构是这样的 {p1_x,p1_y,p1_z,p2_x,p2_y,p2_z,p3_x,p3_y,p3_z...etc}

我需要以最快的方式找到所有这些点的 BoundingBox:

我就是这样做的:

            var xList = new List<float>();
            var yList = new List<float>();
            var zList = new List<float>();

            for (int i = 0; i < Vertices.Length; i++)
            {
                if (i%3==0) //X
                {
                    xList.Add(Vertices[i]);
                }
                else if(i % 3 == 1) // Y
                {
                    yList.Add(Vertices[i]);
                }
                else if (i % 3 == 2) // Z
                {
                    zList.Add(Vertices[i]);
                }
            }
            var xMax = xList.Max();
            var yMax = yList.Max();
            var zMax = zList.Max();
            var xMin = xList.Min();
            var yMin = yList.Min();
            var zMin = zList.Min();

此过程中的每一毫秒都很重要,因为每次视口更新时它都与应用程序一起运行。 我可以知道这个过程是否已经是最快的方法了吗?

几乎与@pneuma 所说的一样,而且与每次都必须检查模数相比,您可以做得更好:

        float
            xMax = float.MinValue,
            xMin = float.MaxValue,
            yMax = float.MinValue,
            yMin = float.MaxValue,
            zMax = float.MinValue,
            zMin = float.MaxValue;
        for (int i = 0; i < Vertices.Length; i += 3)
        {
            xMax = Math.Max(xMax, Vertices[i]);
            xMin = Math.Min(xMin, Vertices[i]);
            yMax = Math.Max(yMax, Vertices[i+1]);
            yMin = Math.Min(yMin, Vertices[i+1]);
            zMax = Math.Max(zMax, Vertices[i+2]);
            zMin = Math.Min(zMin, Vertices[i+2]);
        }

在性能方面,这将是一个改进,尽管可能并不显着。 您正在为自己节省构建这三个列表的不必要开销,这会消耗 RAM(听起来最多 40MB,因为float是 32 位的)以及时间。 除此之外(假设你已经解决了那 3 个 arrays),这至少和 6 个.Max() / .Min()调用一样好,因为它们基本上做的和我们在这里做的完全一样,只是为了一次一个变量。

除非你知道初始列表中点的顺序可以帮助你缩小搜索范围,假设它们是随机分布的,我想不出 C# 单独更有效的东西(也许着色器和 GPU 可以做到这一点更快?)但很高兴被证明是错误的!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM