Unity3D - Me sh .colors очень медленно? - PullRequest
1 голос
/ 16 февраля 2020

Обновление (решено): Ужасная производительность была из-за того, что я не осознавал, что Me sh .vertices.Length делает копию массива при каждом вызове.

Мне нужно процедурно генерировать мне sh четырехугольников. В идеале я хотел бы иметь возможность менять цвет отдельных квадрациклов. Тем не менее, все в порядке, если цветовая дисперсия возникает только на оси x (см. Фото ниже).

Тем не менее, настройка Me sh .Colors равна очень медленно . Например, установка цветов для 100 000 вершин занимает ~ 10000 миллисекунд. Как я могу сделать это более эффективно? Я делаю что-то неправильно?

void CreateMesh()
{
    Mesh.Clear();
    Mesh.vertices = Vertices.ToArray();
    Mesh.triangles = Triangles.ToArray();

    // Set Colors to Mesh
    Color32[] colors = new Color32[] { new Color32(0, 255, 0, 255), new Color32(255, 0, 255, 255), new Color32(0, 0, 255, 255) };
    Color32[] colorsArray = new Color32[Mesh.vertices.Length];

    System.Random rnd = new System.Random();     
    for (int i = 0; i < Mesh.vertices.Length; i++)
        colorsArray[i] = colors[rnd.Next(0, 2)];

    Mesh.colors32 = colorsArray;
}

enter image description here

1 Ответ

2 голосов
/ 16 февраля 2020

Так что я не понял, что Mesh.vertices.length делает копию массива при каждом вызове. ЧТО!?

Расчет длины до решения этой проблемы:

void CreateMesh()
{
    Mesh.Clear();
    Mesh.vertices = Vertices.ToArray();
    Mesh.triangles = Triangles.ToArray();
    Mesh.MarkDynamic();

    int len = Mesh.vertices.Length;

    // Set Colors to Mesh
    Color32[] colors = new Color32[] { new Color32(0, 255, 0, 255), new Color32(255, 0, 255, 255), new Color32(0, 0, 255, 255) };
    Color32[] colorsArray = new Color32[len];

    System.Random rnd = new System.Random();     
    for (int i = 0; i < len; i++)
        colorsArray[i] = colors[rnd.Next(0, 2)];

    Mesh.colors32 = colorsArray;
}
...