3

我对 WPF 相当陌生,我想知道:有没有办法在使用大型网格时优化 WPF(C#) 的性能?我有一个要读取的 STL 文件(~160000 个三角形),我使用了这里的一些说明。我的程序工作流程是:

  1. 将 STL 文件加载到字节数组

  2. 将字节数组中的所有点和法线数据读取到具有 Point3D 和 Vector3D 变量的自定义类

  3. 使用类似于“private Model3DGroup CreateTriangleModel()”的方法

  4. 在 ModelVisual3D 模型中加载生成的 Model3DGroup 三角形

  5. 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);
4

0 回答 0