Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行时优化中的UV展开_C#_Optimization_Unity3d_Unityscript_Uv Mapping - Fatal编程技术网

C# 运行时优化中的UV展开

C# 运行时优化中的UV展开,c#,optimization,unity3d,unityscript,uv-mapping,C#,Optimization,Unity3d,Unityscript,Uv Mapping,我尝试在运行时创建UV,我使用的是长方体类型的UV(类似于3ds max中的长方体UVW),并基于面方向进行计算 我知道在运行时创建它不是一个好选择,但我别无选择:(它在计算后保存,所以我做了一次 但是我花了40秒来做一个测试…太长了 我的代码中是否有可以进行的优化 这是我的代码(如果您有N.y&&N.x>N.z,请随意使用) { uvs[mesh.triangles[i]]=新矢量2(mesh.vertices[mesh.triangles[i]].z,mesh.vertices[mesh.

我尝试在运行时创建UV,我使用的是长方体类型的UV(类似于3ds max中的长方体UVW),并基于面方向进行计算

我知道在运行时创建它不是一个好选择,但我别无选择:(它在计算后保存,所以我做了一次

但是我花了40秒来做一个测试…太长了

我的代码中是否有可以进行的优化

这是我的代码(如果您有N.y&&N.x>N.z,请随意使用) { uvs[mesh.triangles[i]]=新矢量2(mesh.vertices[mesh.triangles[i]].z,mesh.vertices[mesh.triangles[i]].y); UV[mesh.triangles[i+1]]=新矢量2(mesh.Vertexts[mesh.triangles[i+1]]].z,mesh.Vertexts[mesh.triangles[i+1]].y); UV[mesh.triangles[i+2]]=新矢量2(mesh.Vertexts[mesh.triangles[i+2]]].z,mesh.Vertexts[mesh.triangles[i+2]].y); } 否则如果(N.y>N.x&&N.y>N.z) { uvs[mesh.triangles[i]]=新矢量2(mesh.vertices[mesh.triangles[i]].x,mesh.vertices[mesh.triangles[i]].z); UV[mesh.triangles[i+1]]=新矢量2(mesh.Vertexts[mesh.triangles[i+1]]].x,mesh.Vertexts[mesh.triangles[i+1]].z); UV[mesh.triangles[i+2]]=新矢量2(mesh.Vertexts[mesh.triangles[i+2]]].x,mesh.Vertexts[mesh.triangles[i+2]].z); } 否则如果(N.z>N.x&&N.z>N.y) { uvs[mesh.triangles[i]]=新矢量2(mesh.vertices[mesh.triangles[i]].x,mesh.vertices[mesh.triangles[i]].y); UV[mesh.triangles[i+1]]=新矢量2(mesh.Vertexts[mesh.triangles[i+1]]].x,mesh.Vertexts[mesh.triangles[i+1]].y); UV[mesh.triangles[i+2]]=新矢量2(mesh.Vertexts[mesh.triangles[i+2]]].x,mesh.Vertexts[mesh.triangles[i+2]].y); } } 网格uv=uv; Debug.Log(“完成”); }
我强烈建议缓存
网格顶点的副本

财产的文件部分说明:

返回顶点位置的副本或指定新的顶点位置数组

注意“返回一个副本”--您在循环中访问该属性22次,因此这将大致创建该数组的
22n/3
副本。对于具有30000个顶点的网格,这意味着超过200000个不必要的复制操作正在后台进行

如果您创建一个临时数组来保存顶点数据(就像您已经在使用
mesh.uvs
所做的那样),您应该会看到显著的性能改进


您还可以检查
mesh.triangles
是否为复制操作。我预计可能是这样,但文档没有具体说明。

这是我的代码优化,感谢@rutter

public static Vector2[] CreateUV(ref Mesh mesh)
{

    int i = 0;
    Vector3 p = Vector3.up;
    Vector3 u = Vector3.Cross(p, Vector3.forward);
    if (Vector3.Dot(u, u) < 0.001f)
    {
        u = Vector3.right;
    }
    else
    {
        u = Vector3.Normalize(u);
    }

    Vector3 v = Vector3.Normalize(Vector3.Cross(p, u));
    Vector3[] vertexs = mesh.vertices;
    int[] tris = mesh.triangles;
    Vector2[] uvs = new Vector2[vertexs.Length];

    for (i = 0; i < tris.Length; i += 3)
    {

        Vector3 a = vertexs[tris[i]];
        Vector3 b = vertexs[tris[i + 1]];
        Vector3 c = vertexs[tris[i + 2]];
        Vector3 side1 = b - a;
        Vector3 side2 = c - a;
        Vector3 N = Vector3.Cross(side1, side2);

        N = new Vector3(Mathf.Abs(N.normalized.x), Mathf.Abs(N.normalized.y), Mathf.Abs(N.normalized.z));



        if (N.x > N.y && N.x > N.z)
        {
            uvs[tris[i]] = new Vector2(vertexs[tris[i]].z, vertexs[tris[i]].y);
            uvs[tris[i + 1]] = new Vector2(vertexs[tris[i + 1]].z, vertexs[tris[i + 1]].y);
            uvs[tris[i + 2]] = new Vector2(vertexs[tris[i + 2]].z, vertexs[tris[i + 2]].y);
        }
        else if (N.y > N.x && N.y > N.z)
        {
            uvs[tris[i]] = new Vector2(vertexs[tris[i]].x, vertexs[tris[i]].z);
            uvs[tris[i + 1]] = new Vector2(vertexs[tris[i + 1]].x, vertexs[tris[i + 1]].z);
            uvs[tris[i + 2]] = new Vector2(vertexs[tris[i + 2]].x, vertexs[tris[i + 2]].z);
        }
        else if (N.z > N.x && N.z > N.y)
        {
            uvs[tris[i]] = new Vector2(vertexs[tris[i]].x, vertexs[tris[i]].y);
            uvs[tris[i + 1]] = new Vector2(vertexs[tris[i + 1]].x, vertexs[tris[i + 1]].y);
            uvs[tris[i + 2]] = new Vector2(vertexs[tris[i + 2]].x, vertexs[tris[i + 2]].y);
        }

    }

    mesh.uv = uvs;
    return uvs;
}
publicstaticvector2[]CreateUV(参考网格)
{
int i=0;
向量3 p=向量3.up;
Vector3U=Vector3.交叉(p,Vector3.向前);
if(矢量3.点(u,u)<0.001f)
{
u=矢量3.5右;
}
其他的
{
u=矢量3.归一化(u);
}
vector3v=Vector3.归一化(Vector3.交叉(p,u));
Vector3[]顶点=网格顶点;
int[]tris=网格三角形;
Vector2[]uvs=新的Vector2[vertexs.Length];
对于(i=0;iN.y&&N.x>N.z)
{
uvs[tris[i]]=新矢量2(顶点[tris[i]].z,顶点[tris[i]].y);
uvs[tris[i+1]]=新矢量2(顶点[tris[i+1]].z,顶点[tris[i+1]].y);
uvs[tris[i+2]]=新矢量2(顶点[tris[i+2]].z,顶点[tris[i+2]].y);
}
否则如果(N.y>N.x&&N.y>N.z)
{
uvs[tris[i]]=新矢量2(顶点[tris[i]].x,顶点[tris[i]].z);
uvs[tris[i+1]]=新矢量2(顶点[tris[i+1]].x,顶点[tris[i+1]]].z);
uvs[tris[i+2]]=新矢量2(顶点[tris[i+2]].x,顶点[tris[i+2]].z);
}
否则如果(N.z>N.x&&N.z>N.y)
{
uvs[tris[i]]=新矢量2(顶点[tris[i]].x,顶点[tris[i]].y);
uvs[tris[i+1]]=新矢量2(顶点[tris[i+1]].x,顶点[tris[i+1]].y);
uvs[tris[i+2]]=新矢量2(顶点[tris[i+2]].x,顶点[tris[i+2]].y);
}
}
网格uv=uv;
返回UV;
}
public static Vector2[] CreateUV(ref Mesh mesh)
{

    int i = 0;
    Vector3 p = Vector3.up;
    Vector3 u = Vector3.Cross(p, Vector3.forward);
    if (Vector3.Dot(u, u) < 0.001f)
    {
        u = Vector3.right;
    }
    else
    {
        u = Vector3.Normalize(u);
    }

    Vector3 v = Vector3.Normalize(Vector3.Cross(p, u));
    Vector3[] vertexs = mesh.vertices;
    int[] tris = mesh.triangles;
    Vector2[] uvs = new Vector2[vertexs.Length];

    for (i = 0; i < tris.Length; i += 3)
    {

        Vector3 a = vertexs[tris[i]];
        Vector3 b = vertexs[tris[i + 1]];
        Vector3 c = vertexs[tris[i + 2]];
        Vector3 side1 = b - a;
        Vector3 side2 = c - a;
        Vector3 N = Vector3.Cross(side1, side2);

        N = new Vector3(Mathf.Abs(N.normalized.x), Mathf.Abs(N.normalized.y), Mathf.Abs(N.normalized.z));



        if (N.x > N.y && N.x > N.z)
        {
            uvs[tris[i]] = new Vector2(vertexs[tris[i]].z, vertexs[tris[i]].y);
            uvs[tris[i + 1]] = new Vector2(vertexs[tris[i + 1]].z, vertexs[tris[i + 1]].y);
            uvs[tris[i + 2]] = new Vector2(vertexs[tris[i + 2]].z, vertexs[tris[i + 2]].y);
        }
        else if (N.y > N.x && N.y > N.z)
        {
            uvs[tris[i]] = new Vector2(vertexs[tris[i]].x, vertexs[tris[i]].z);
            uvs[tris[i + 1]] = new Vector2(vertexs[tris[i + 1]].x, vertexs[tris[i + 1]].z);
            uvs[tris[i + 2]] = new Vector2(vertexs[tris[i + 2]].x, vertexs[tris[i + 2]].z);
        }
        else if (N.z > N.x && N.z > N.y)
        {
            uvs[tris[i]] = new Vector2(vertexs[tris[i]].x, vertexs[tris[i]].y);
            uvs[tris[i + 1]] = new Vector2(vertexs[tris[i + 1]].x, vertexs[tris[i + 1]].y);
            uvs[tris[i + 2]] = new Vector2(vertexs[tris[i + 2]].x, vertexs[tris[i + 2]].y);
        }

    }

    mesh.uv = uvs;
    return uvs;
}