私はWPFにかなり慣れていないので、疑問に思っています:大きなメッシュを扱うときにWPF(C#)のパフォーマンスを最適化する方法はありますか? 読み取るSTLファイル(〜160000個の三角形)があり、ここからいくつかの指示を使用します。私のプログラムのワークフローは次のとおりです。
STLファイルをバイト配列にロード
Point3D および Vector3D 変数を使用して、バイト配列からカスタム クラスにすべてのポイントおよび法線データを読み取ります。
「private Model3DGroup CreateTriangleModel()」と同様のメソッドを使用します
結果の三角形の Model3DGroup を ModelVisual3D モデルにロードします
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);