我的程序在运行时接收一个网格。该网格可能由超过200k个顶点组成。 我需要将其反转(内部变为外部)。我已经反转了索引,但我还需要翻转法线。到目前为止,我使用了以下循环:
Vector3[] newnormals = new Vector3[mesh.normals.Length];
for (int i=0;i<mesh.normals.Length;i++)
{
newnormals[i] = -mesh.normals[i];
}
revMesh.normals = newnormals;
其中 "mesh" 是原始网格,当然 "revMesh" 则是反向网格。 我不知道为什么,但这个循环非常慢。在我的 i7 上需要很多秒才能完成。如果我用以下内容代替它:
revMesh.RecalculateNormals();
执行时间降至100毫秒以下。
我的例程为什么效率如此低下?有没有什么方法可以加快速度?
mesh.normals[0] = new Vector3(x,y,z);
这样的操作,而必须始终复制整个数组,修改它并将整个数组作为状态写回。请注意:要更改法线,重要的是从网格中复制法线。一旦复制并更改了法线,就可以将法线重新分配回网格。 (https://docs.unity3d.com/ScriptReference/Mesh-normals.html) - derHugoFoo
,其中有一个int[] Bar {get; set;}
属性,并且我分配int[] x = fooInstance.Bar;
,那么修改x[n]
也将修改fooInstance.Bar[n]
。这必须是属性getter返回数组的副本而不是引用。 - Rufus L