Улучшите производительность рендеринга WPF с помощью Helix Toolkit.

Я визуализирую большое количество сеток, загруженных как stl, а затем добавленных в область просмотра, которая является объектом HelixViewport3D. Все сетки статичны в окружающей среде.

// in MainWindow.xaml
 <HelixToolkit:HelixViewport3D x:Name ="viewPort" ZoomExtentsWhenLoaded="True" Margin="250,-15,0,15">

// in MainWindow.cs Constructor
this.viewPort = new HelixViewport3D();
foreach(string path in meshPaths){
    ModelVisual3D meshModel = loadMesh(path);
    viewport.Children.Add(meshModel);
}

Поскольку количество мешей велико, производительность рендеринга довольно низкая (зависает во время вращения, трудно увеличить масштаб...). Как упростить поворот сцены и управление ею?


person Nic    schedule 27.10.2015    source источник
comment
Нашли ли вы какое-либо решение о производительности со многими объектами? Мне нужно работать с файлом 3ds размером 70 МБ. Я пытаюсь удалить сетки с размером границы менее xxx% относительно максимальных видимых границ (но я не нашел никакого способа узнать максимальные видимые границы...)   -  person Mauro Destro    schedule 12.02.2016
comment
Привет @MauroDestro, на самом деле я не сильно поправился. Хотя ваш подход кажется многообещающим. Возможно, вы можете сравнить его с процентом от самого окна просмотра.   -  person Nic    schedule 15.02.2016
comment
Да @Nic, но я не смог найти размер видимой части пространства (например, границы невидимой сферы, содержащей всю видимую модель), чтобы выполнить расчет%   -  person Mauro Destro    schedule 15.02.2016


Ответы (1)


Что касается замечаний ModelVisual3D, это связано с большими накладными расходами, связанными с рендерингом, тестированием попадания и т. д.

Поэтому вам может помочь уменьшить количество визуальных элементов и соединить их вместе:

this.viewPort = new HelixViewport3D();
var meshes = new Model3DGroup();
foreach (string path in meshPaths)
{
    // just take the model of the loaded 3d object
    meshes.Children.Add(loadMesh(path).Content);
}
viewport.Children.Add(new ModelVisual3D() { Content = meshes });

Если вы не собираетесь менять модели, вы можете просто заморозить их перед добавлением к HelixViewport3D:

meshes.Freeze();
person bbenno    schedule 17.12.2019