2016-11-11 12 views
0

MeshGeometryModel3D要素の多いViewport3DXを使用しています。 ユーザーインターフェイスには、すべてのmodel3d要素の不透明度(アルファ値:PhongMaterials)を更新するスライダーが組み込まれています。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のが、代わりに新しいカラーオブジェクトをインスタンス化

    誰かがボトルネックをbかもしれないという考えを持っていますここにe。それは材料の複製、新しい色のインスタンス化、またはその両方ですか?それとも全く違う何か?アップデートを行うためのより良い方法はありますか? あなたの提案を聞いて不思議です。ありがとうございました!

  • +0

    あなたはUpdateOpacityをトリガするために "にValueChanged" イベントを使用していますか?ユーザーがスライダのドラッグを完​​了したときに、不透明度を更新することだけを検討することができます。https://social.msdn.microsoft.com/Forums/vstudio/en-US/d8b9c195-12b9-45f5-8880-94cb05aefdee/slider -event-for-end-of-sliding?フォーラム= wpf。私が持っている他の唯一の提案は、同じ基本色を持つ要素を結合/グループ化しようとすることなので、不透明度更新に必要な材料の変更は少なくなります。 – 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

    関連する問題