【问题标题】:Unity3D - Mesh.colors is extremely slow?Unity3D - Mesh.colors 非常慢?
【发布时间】:2020-02-16 14:57:40
【问题描述】:

更新(已解决):糟糕的表现是因为我没有意识到 Mesh.vertices.Length 在每次调用时都会复制一个数组。

我需要在程序上生成一个四边形网格。理想情况下,我希望能够更改单个四边形的颜色。但是,如果颜色变化只发生在 x 轴上,也没关系(见下图)。

但是设置 Mesh.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;
}

【问题讨论】:

  • 请注意有一个Mesh.MarkDynamic() 函数,您可能想尝试一下。除此之外,为了获得一些背景(这可能有助于回答),为什么需要动态生成网格和网格颜色?
  • 我尝试了 MarkDynamic(),但它似乎对性能没有明显影响。我要做的是为每个四边形设置不同的颜色。
  • 随机并没有那么快。
  • 在解决颜色变化方面,多种预制材料(可能在顶部以 90 度的步长旋转)对您有用吗?
  • 我解决了这个问题,我没有意识到 Mesh.vertices.length 每次调用都会复制一个数组。

标签: c# unity3d mesh


【解决方案1】:

所以我没有意识到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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2015-06-14
    • 2013-05-14
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多