我对 WPF 相当陌生,我想知道:有没有办法在使用大型网格时优化 WPF(C#) 的性能?我有一个要读取的 STL 文件(~160000 个三角形),我使用了这里的一些说明。我的程序工作流程是:
将 STL 文件加载到字节数组
将字节数组中的所有点和法线数据读取到具有 Point3D 和 Vector3D 变量的自定义类
使用类似于“private Model3DGroup CreateTriangleModel()”的方法
在 ModelVisual3D 模型中加载生成的 Model3DGroup 三角形
this.mainViewport.Children.Add(model);
是否有更直接的方法将点/法线/三角形/曲面加载到视口以避免某些步骤?从我现在看到的情况来看,相同的数据在不同的结构中被重用。一个结构将相同的数据传递给下一个。
*最大的开销在第 3 步。我担心的是,当我加载 1000 个三角形时,它需要 458 毫秒,但对于 2000 年,它需要 1280 毫秒,对于 4000 - 4076 毫秒,依此类推。所有其他步骤都在瞬间执行。
**我认为渲染将是最大的时间消耗者,但它似乎正在将数据从点加载到网格到模型再到组。
基本上我有一个 stlModel,它包含一个 StlTriangles 数组(一个包含 3 个顶点点 3D 和 1 个法线向量 3D 的类):
Model3DGroup model3D = new Model3DGroup();
Material objectMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.Coral));
GeometryModel3D triangle;
MeshGeometry3D mesh;
ModelVisual3D solidModel3D = new ModelVisual3D();
stlModel.loadTriangles();
for (int i = 0; i < stlModel.Triangles.Length; i++)
{
mesh = new MeshGeometry3D();
mesh.Positions.Add(stlModel.Triangles[i].Vertex1);
mesh.Positions.Add(stlModel.Triangles[i].Vertex2);
mesh.Positions.Add(stlModel.Triangles[i].Vertex3);
mesh.TriangleIndices.Add(0);
mesh.TriangleIndices.Add(1);
mesh.TriangleIndices.Add(2);
mesh.Normals.Add(stlModel.Triangles[i].Normal);
mesh.Normals.Add(stlModel.Triangles[i].Normal);
mesh.Normals.Add(stlModel.Triangles[i].Normal);
triangle = new GeometryModel3D(mesh, objectMaterial);
model3D.Children.Add(triangle);
}
solidModel3D.Content = model3D;
this.mainViewport.Children.Add(solidModel3D);