【发布时间】:2016-11-11 21:35:56
【问题描述】:
我正在使用带有许多不同 MeshGeometryModel3D 元素的 Viewport3DX。
用户界面集成了一个滑块,该滑块将更新所有 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 元素的字典并更新它们的材质。
我尝试了许多不同的版本,但最终这是完成这项工作的唯一实现。但是,即使在发布模式下,更新也非常缓慢且“滞后”。
我认识到两件事:
-
我必须克隆现有材质,对其进行更新并重新分配,以使材质在视口中发生变化
-
我无法直接设置
Diffusecolor的 alpha 属性,而是实例化一个新的颜色对象
有人知道瓶颈可能在哪里吗?是材料的克隆、新颜色的实例化还是两者兼而有之?还是完全不同的东西?有没有更好的更新方法? 很想听听你的建议。已经非常感谢了!
【问题讨论】:
-
您是否使用“ValueChanged”事件来触发UpdateOpacity?当用户完成拖动滑块时,您可能只想查看更新不透明度:social.msdn.microsoft.com/Forums/vstudio/en-US/…。我唯一的其他建议是尝试将具有相同基色的元素组合/组合在一起,因此不透明度更新所需的材料更改更少。
-
我实际上使用了“ValueChanged”事件,这是个好主意,我会试试这个。相同颜色元素的分组和缓存也是我脑海中浮现的事情,但遗憾的是在我的情况下不会奏效。谢谢你的回答迈克尔!
-
MSDN 有一个不错的指南来提高 WPF 图形性能,也许其中一些建议也可以提供帮助:msdn.microsoft.com/en-us/library/bb613553.aspx