我使用的Viewport3DX
與許多不同的MeshGeometryModel3D
元素。 用戶界面集成了一個滑塊,用於更新所有model3d元素的不透明度(alpha值爲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
函數,迭代元素的字典並更新其材質。
我嘗試了很多不同的版本,但最終這是做這項工作的唯一實現。然而,即使在發佈模式下,更新速度也非常緩慢且「滯後」。
我認出了兩兩件事:
我不得不克隆現有的材料,更新和分配回得到的材料在視口中改變
我不能直接設置在
Diffusecolor
的
人是否有一個想法,可能的瓶頸b是出阿爾法屬性,而是實例化一個新的顏色對象在這裏。是克隆材料,實例化新顏色還是兩者?或者完全不同的東西?有沒有更好的方法來做更新? 好奇聽到你的建議。非常感謝!
您是否使用 「的ValueChanged」 事件觸發UpdateOpacity?您可能想要在用戶完成拖動滑塊時只考慮更新不透明度:https://social.msdn.microsoft.com/Forums/vstudio/en-US/d8b9c195-12b9-45f5-8880-94cb05aefdee/slider -event換下場,滑動的?論壇= WPF。我唯一的建議是嘗試將具有相同基色的元素組合/組合在一起,因此不透明度更新需要更少的材料更改。 – Michael
我實際上使用「ValueChanged」事件,這是一個整潔的想法,我會試試這個。對同樣的彩色元素進行分組和緩存,也是我腦海中浮現出來的東西,但遺憾的是我不能解決這個問題。謝謝你的回答Michael! – Daniel
MSDN有一個體面的指南來改善一般WPF圖形性能,也許這些建議中的一些可能也有幫助:https://msdn.microsoft.com/en-us/library/bb613553.aspx – Michael