2015-07-06 7 views
3

Я пытаюсь визуализировать облако точек ~ 170000 точек с помощью элемента управления ViewPort WPF. После создания координат трехмерных точек я создаю треугольник с определенным размером в каждой точке и добавляю его к объекту Model3DGroup, который я добавляю к моему файлу Viewport aftwerwards.Визуализация облаков точек в WPF Viewport3D чрезвычайно медленная

Моя проблема заключается в том, что приведенный ниже код отвечает за выполнение только трех секунд. После того, как Model3DGroup добавлен в Viewport, пользовательский интерфейс заморозится еще на 3-5 секунд.

Как я могу сделать эту работу быстрее? Кроме того, если Viewport3D не может обрабатывать модели этого номера, может ли кто-нибудь рекомендовать альтернативный способ визуализации облака точек в элементе управления WPF?

 viewport.Children.Clear(); 

     Model3DGroup triangles = new Model3DGroup(); 
     foreach (Point3D point in workspace.PointCloud) 
     { 
      double x = point.X; 
      double y = point.Y; 
      double z = point.Z; 

      Point3D p1 = new Point3D(x + 0.005, y, z); 
      Point3D p2 = new Point3D(x, y + 0.005, z); 

      MeshGeometry3D mymesh = new MeshGeometry3D(); 
      mymesh.Positions.Add(point); 
      mymesh.Positions.Add(p1); 
      mymesh.Positions.Add(p2); 
      mymesh.TriangleIndices.Add(0); 
      mymesh.TriangleIndices.Add(1); 
      mymesh.TriangleIndices.Add(2); 

      Vector3D Normal = GeometryHelper.CalculateTraingleNormal(p0, p1, p2); 
      mymesh.Normals.Add(Normal); 
      mymesh.Normals.Add(Normal); 
      mymesh.Normals.Add(Normal); 

      Material Material = new DiffuseMaterial(
       new SolidColorBrush(Colors.Red) { Opacity = 0.5 }); 
      GeometryModel3D model = new GeometryModel3D(
       mymesh, Material); 

      triangles.Children.Add(model); 
     } 

     ModelVisual3D modelVisual = new ModelVisual3D(); 
     modelVisual.Content = triangles; 
     viewport.Children.Add(modelVisual); 
+0

Даже после ваших усилий по оптимизации, я не верю, что вы увидите результаты, которые ищете. Вы можете лучше обслуживаться чистым нативным решением и D3D. Похоже на забавный проект. Удачи. – Jeff

ответ

1

Per This Page:

Создание различных моделей только тогда, когда они требуют различных материалов или преображается. В противном случае попробуйте объединить множество экземпляров GeometryModel3D с теми же материалами и преобразованиями в несколько более крупных экземпляров GeometryModel3D и MeshGeometry3D размером .

Вместо создания нескольких MeshGeometry3D создайте только один и добавьте его в один GeometryModel3D. Добавьте этот одиночный GeometeryModel3D к вашему ModelVisual3D. Это должно значительно улучшить производительность вашей модели (я сам это испытал).

Дополнительные улучшения скорости вы можете создавать свои позиции параллельно (Parallel.ForEach Example)

 List<Point3D> points = new List<Point3D>(); 
     Parallel.ForEach(workspace.PointCloud, point => 
     { 
     //Do Work 
     } 
    ); 
     Point3DCollection p3d = new Point3DCollection(points); 
     mymesh.Positions = p3d; 

Я не проверял этот код. Возможно, потребуется дополнительная работа, чтобы заставить ее работать параллельно. Не забудьте создать точки в триплетах, иначе вы получите очки в очень странном порядке, которые создадут сумасшедшие треугольники.

Вы можете пропустить указание TriangleIndices, поскольку они выводятся, если не указаны. Хотя я сомневаюсь, что вы купите вам много времени на обработку, и я не уверен, что это повлияет на производительность позже.

+0

Хмм ... Я не заметил, пока после того, как я разместил это, вопрос 2 месяца! О, ну ... Для потомков! – MikeH

Смежные вопросы