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。それは材料の複製、新しい色のインスタンス化、またはその両方ですか?それとも全く違う何か?アップデートを行うためのより良い方法はありますか? あなたの提案を聞いて不思議です。ありがとうございました!
あなたはUpdateOpacityをトリガするために "にValueChanged" イベントを使用していますか?ユーザーがスライダのドラッグを完了したときに、不透明度を更新することだけを検討することができます。https://social.msdn.microsoft.com/Forums/vstudio/en-US/d8b9c195-12b9-45f5-8880-94cb05aefdee/slider -event-for-end-of-sliding?フォーラム= wpf。私が持っている他の唯一の提案は、同じ基本色を持つ要素を結合/グループ化しようとすることなので、不透明度更新に必要な材料の変更は少なくなります。 – Michael
私は実際に "ValueChanged"イベントを使用しています。これはきちんとしたアイデアです。これを試してみます。同じ色の要素のグループ分けとキャッシングは、私の心にも飛び込んだものですが、私の場合は悲しいことにはうまくいかないでしょう。あなたの答えマイケルありがとう! – Daniel
MSDNは一般的にWPFグラフィックスのパフォーマンスを向上させるための適切なガイドを持っていますが、多分これらの提案のいくつかが役に立ちます:https://msdn.microsoft.com/en-us/library/bb613553.aspx – Michael