2016-11-11 5 views
0

Я использую 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, но вместо того, чтобы создать экземпляр нового объекта цвета

ли кто-то есть идея, где узкое место может б здесь. Является ли это клонированием материала, создавая новый цвет или и то, и другое? Или что-то совсем другое? Есть ли лучшие способы сделать обновления? Любопытно услышать ваше предложение. Большое спасибо!

+0

Вы используете "ValueChanged" событие, чтобы вызвать UpdateOpacity? Возможно, вам стоит взглянуть только на обновление непрозрачности, когда пользователь выполнил перетаскивание ползунка: https://social.msdn.microsoft.com/Forums/vstudio/en-US/d8b9c195-12b9-45f5-8880-94cb05aefdee/slider -Event-для-отслужившего скольжение? форум = МОФ. Единственное другое предложение, которое у меня есть, - попытаться объединить/сгруппировать элементы, которые имеют один и тот же базовый цвет, поэтому в обновлении непрозрачности требуется меньше существенных изменений. – Michael

+0

Я действительно использую событие «ValueChanged», это чистая идея, я попробую это. Группировка и кеширование одних и тех же цветных элементов - это то, что появилось у меня в голове, но, к сожалению, в моем случае это не сработает.Спасибо за ваш ответ Майкл! – Daniel

+0

MSDN имеет достойное руководство по улучшению производительности графики WPF в целом, возможно, некоторые из этих предложений также могут помочь: https://msdn.microsoft.com/en-us/library/bb613553.aspx – Michael

ответ

1

Я собираюсь сделать ссылку на мой комментарий здесь, чтобы мы могли закрыть этот вопрос.

Вы используете событие ValueChanged для запуска UpdateOpacity? Возможно, вы захотите изучить только обновление непрозрачности, когда пользователь выполнил перетаскивание слайдера: social.msdn.microsoft.com/Forums/vstudio/en-US/.... Единственное другое предложение, которое у меня есть, - попытаться объединить/сгруппировать элементы, которые имеют один и тот же базовый цвет, поэтому в обновлении непрозрачности требуется меньше существенных изменений.

...

msdn.microsoft.com/en-us/library/bb613553.aspx

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