![](/img/trans.png)
[英]Fastest way to convert float to bytes and then save byte array in memory?
[英]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.