【发布时间】:2021-05-24 14:23:42
【问题描述】:
所以我有这个 for 循环:
for (int i = 0; i < meshes.Count; i++)
{
for (int j = 0; j < meshes.Count; j++)
{
for (int m = 0; m < meshes[i].vertices.Length; m++)
{
for (int n = 0; n < meshes[i].vertices.Length; n++)
{
if ((meshes[i].vertices[m].x == meshes[j].vertices[n].x) && (meshes[i].vertices[m].z == meshes[j].vertices[n].z))
{
if (meshes[i].vertices[m] != meshes[j].vertices[n])
{
meshes[i].vertices[m].y = meshes[j].vertices[n].y;
}
}
}
}
}
}
它通过几百万个向量并将它们与所有其他向量进行比较,然后修改它们的一些 y 值。我认为它有效,但是在点击播放后,加载需要非常长的时间(目前已经等待 15 分钟,并且仍在继续)。有没有办法让它更有效率?感谢您的帮助!
【问题讨论】:
-
并不是说这会使您的处理速度更快,但鉴于您的
if条件,您的第四个循环可能应该是for (int n = 0; n < meshes[j].vertices.Length; n++) -
@derpirscher 谢谢,我没有费心把正确的变量放在那里的原因是所有顶点数组的大小都相同,所以(据我所知)这不重要。跨度>
-
能否请您描述一下初始问题?你有几百万个向量,你想得到(执行)什么?
-
你的内在如果看起来不必要地昂贵。您是在说“如果 x 相同且 z 相同并且整个顶点不同,这可能会再次比较 x 和 z(我假设这些是结构)。你可以只比较那里的 y,但如果没有副作用,您可能只是跳过比较并分配 y。
-
我不会尝试优化此循环,而是尝试生成您的网格,以便每个顶点的 y 坐标与其邻居相同。如果您知道地形的总长度和宽度,那么您应该能够计算给定网格的邻居在
meshes中的索引。使用这样的循环——即使你对其进行了优化——你的绝大多数比较都是在不是邻居的网格之间进行的,所以这都是浪费时间。
标签: c# for-loop unity3d optimization