簡體   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