我的程序在运行时收到一个网格。网格可以由超过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”是原始Mesh,当然“ revMesh”是反向的。
我不知道为什么,但是这个循环非常慢。我的i7需要花几秒钟的时间。如果我用

revMesh.RecalculateNormals();


执行时间降至100毫秒以下。…

为什么我的例行程序效率如此低下?有什么办法可以加快速度吗?

最佳答案

也许在每次迭代中获取mesh.normals[i]都会使其变慢,请尝试:

Vector3[] newnormals= revMesh.normals;
for (int i=0;i<newnormals.Length;i++)
    newnormals[i] = -newnormals[i];
revMesh.normals = newnormals;



  注意:要更改法线,从网格物体复制法线很重要。一旦复制并更改了法线,即可将法线重新分配给网格。
  
  https://docs.unity3d.com/ScriptReference/Mesh-normals.html


您也可以这样做:(没有测试,但我认为它可行)

using System.Linq;
revMesh.triangles = revMesh.triangles.Reverse().ToArray();

09-11 12:35