3

私はWPFにかなり慣れていないので、疑問に思っています:大きなメッシュを扱うときにWPF(C#)のパフォーマンスを最適化する方法はありますか? 読み取るSTLファイル(〜160000個の三角形)があり、ここからいくつかの指示を使用します。私のプログラムのワークフローは次のとおりです。

  1. STLファイルをバイト配列にロード

  2. Point3D および Vector3D 変数を使用して、バイト配列からカスタム クラスにすべてのポイントおよび法線データを読み取ります。

  3. 「private Model3DGroup CreateTriangleModel()」と同様のメソッドを使用します

  4. 結果の三角形の Model3DGroup を ModelVisual3D モデルにロードします

  5. this.mainViewport.Children.Add(モデル);

一部の手順を回避するために、ポイント/法線/三角形/サーフェスをビューポートにロードするより直接的な方法はありますか? 私が今見たところ、同じデータが異なる構造で再利用されています。同じデータを次の構造に渡す 1 つの構造。

*最大のオーバーヘッドはステップ 3 にあります。私の懸念は、1000 個の三角形をロードすると 458 ミリ秒かかることですが、2000 の場合は 1280 ミリ秒、4000 の場合は 4076 ミリ秒など、幾何学的に進行します。他のすべてのステップは瞬時に実行されます。

**レンダリングが最大の時間浪費者になると思っていましたが、ポイントからメッシュ、モデル、グループへとデータをロードしているようです。

基本的に、StlTriangles (3 つの頂点 points3D と 1 つの法線 vector3D を含むクラス) の配列を保持する stlModel があります。

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