C# 运行时优化中的UV展开
我尝试在运行时创建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(“完成”); }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.
我强烈建议缓存
网格顶点的副本
财产的文件部分说明:
返回顶点位置的副本或指定新的顶点位置数组
注意“返回一个副本”--您在循环中访问该属性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;
}