更新 model3d 元素颜色的有效方法

Efficient way of updating colors of model3d elements

我使用的 Viewport3DX 有很多不同的 MeshGeometryModel3D 元素。 用户界面集成了一个滑块,它将更新所有 model3d 元素的不透明度(PhongMaterials 的 alpha 值。

这是我当前执行的更新不透明度的代码:

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 元素的字典并更新它们的 materials。

我尝试了很多不同的版本,但最后这是唯一能完成这项工作的实现。但是更新速度非常慢 'laggy',即使在发布模式下也是如此。

我认出了两件事:

有人知道瓶颈在哪里吗?是克隆 material、实例化新颜色还是两者兼而有之?或者完全不同的东西?有没有更好的方法来进行更新? 很想听听你的建议。已经非常感谢了!

我将在这里引用我的评论,这样我们就可以结束这个问题了。

您是否使用 "ValueChanged" 事件来触发 UpdateOpacity?当用户完成拖动滑块时,您可能希望只更新不透明度:social.msdn.microsoft.com/Forums/vstudio/en-US/…。我唯一的其他建议是尝试 combine/group 将具有相同基色的元素放在一起,这样不透明度更新所需的 material 更改就更少了。

...

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