Я использую Viewport3DX
с множеством различных элементов MeshGeometryModel3D
. Пользовательский интерфейс объединяет слайдер, который обновляет непрозрачность (альфа-значение PhongMaterials
) всех элементов model3d.Эффективный способ обновления цветов элементов model3d
Это моя текущая реализация кода, который обновляет непрозрачность:
geometryhandler.cs
public void UpdateOpacity(double value)
{
if (_mainWindow.MyBuildingComponents == null) return;
foreach (var component in _mainWindow.MyBuildingComponents)
{
// assign new material and later assign it back, to get the changes of the material recognized
var newmaterial = (_meshIdTogeometryModel3D[component.Id].Material as PhongMaterial).Clone();
// create new DiffusColor because setting the alpha property directly is not possible
newmaterial.DiffuseColor = new Color4(newmaterial.DiffuseColor.Red, newmaterial.DiffuseColor.Green, newmaterial.DiffuseColor.Blue, (float)value);
_meshIdTogeometryModel3D[component.Id].Material = newmaterial;
}
}
MainWindow.xaml.cs
private void UpdateOpacity(object sender, RoutedPropertyChangedEventArgs<double> e)
{
Geometryhandler?.UpdateOpacity(SliderModelOpacity.Value);
}
Функция UpdateOpacity
вызывается каждый раз, когда изменяется значение ползунка, итерации через словарь MeshGeometryModel3D
элементов и обновляются их материалы.
Я пробовал много разных версий, но в конце концов это была единственная реализация, которая выполняла эту работу. Однако обновление происходит очень медленно и «ломается» даже в режиме выпуска.
я узнал две вещи:
мне пришлось клонировать существующий материал, обновить его и назначить его обратно, чтобы получить материал, чтобы изменить в окне
Я не мог сразу установить альфа-свойство
Diffusecolor
, но вместо того, чтобы создать экземпляр нового объекта цвета
ли кто-то есть идея, где узкое место может б здесь. Является ли это клонированием материала, создавая новый цвет или и то, и другое? Или что-то совсем другое? Есть ли лучшие способы сделать обновления? Любопытно услышать ваше предложение. Большое спасибо!
Вы используете "ValueChanged" событие, чтобы вызвать UpdateOpacity? Возможно, вам стоит взглянуть только на обновление непрозрачности, когда пользователь выполнил перетаскивание ползунка: https://social.msdn.microsoft.com/Forums/vstudio/en-US/d8b9c195-12b9-45f5-8880-94cb05aefdee/slider -Event-для-отслужившего скольжение? форум = МОФ. Единственное другое предложение, которое у меня есть, - попытаться объединить/сгруппировать элементы, которые имеют один и тот же базовый цвет, поэтому в обновлении непрозрачности требуется меньше существенных изменений. – Michael
Я действительно использую событие «ValueChanged», это чистая идея, я попробую это. Группировка и кеширование одних и тех же цветных элементов - это то, что появилось у меня в голове, но, к сожалению, в моем случае это не сработает.Спасибо за ваш ответ Майкл! – Daniel
MSDN имеет достойное руководство по улучшению производительности графики WPF в целом, возможно, некоторые из этих предложений также могут помочь: https://msdn.microsoft.com/en-us/library/bb613553.aspx – Michael