Vector3 * плавать очень медленно - PullRequest
3 голосов
/ 11 июня 2019

Моя программа получает Mesh во время выполнения. Сетка может быть сделана из более чем 200 тысяч вершин. Мне нужно полностью изменить это (наизнанку). Я переворачиваю индексы, но мне также нужно инвертировать нормали. До сих пор я использовал этот цикл:

    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 мс ...

Почему моя рутина так неэффективна? Есть ли способ ускорить его?

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Возможно, получение mesh.normals[i] в каждой итерации замедляет работу, попробуйте:

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

Примечание: Для внесения изменений в нормали важно скопировать нормали из сетки. Как только нормали были скопированы и изменены, нормали могут быть переназначены обратно в Mesh.

https://docs.unity3d.com/ScriptReference/Mesh-normals.html

Вы также можете сделать: (не проверял, но я думаю, что это работает)

using System.Linq;
revMesh.triangles = revMesh.triangles.Reverse().ToArray();
2 голосов
/ 12 июня 2019

Основная проблема в том, что чтение mesh.normals не имеет прямого доступа к массиву.Unity создает копию этого массива и передает вам копию.Вы читаете mesh.normals дважды за итерацию цикла, поэтому для меша с нормали в 200 тыс. Вы будете создавать 400 тыс. Копий этого массива.Это может работать очень медленно, действительно.

Будет намного быстрее запросить у Unity одну копию массива, выполнить свою работу с ней, а затем один раз передать данные в Unityэто сделано.

Внутренние классы Unity имеют несколько свойств, которые возвращают свежие копии каждый раз, когда их читают.Всегда полезно проверить руководство, если вы не уверены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...