具有Opacity = 0的DrawingVisual性能

时间:2008-11-12 17:59:54

标签: wpf

如果我在WPF中有一个Opacity = 0的DrawingVisual,那是否足以让它不被绘制?我们在Canvas上有数百个DrawingVisuals,并且当前在不显示的视觉效果上设置Opacity = 0,并且我想确保在渲染具有Opacity = 0的DrawingVisual时没有渲染渲染性能。

更新:我通过测试发现,当Opacity = 0时会有开销,但由于DrawingVisual没有Visibility属性,我不知道除非你实际删除它否则你会告诉它不显示从视觉树,所以欢迎任何建议。

4 个答案:

答案 0 :(得分:2)

检查的最佳方法是将Visibility设置为Visibility.Colapsed,并查看是否存在任何绘图性能差异。

Visibility.Colapsed确保元素不可见,但也不会参与UI的排列,测量和渲染过程,而Opacity = 0的元素可能参与所有过程。

答案 1 :(得分:2)

我使用DrawingGroup并在DrawingGroup中添加或删除Drawing个对象解决了一个非常类似的问题,因为它们需要显示或隐藏。关键是要以易于管理的方式整理您的Drawing个对象,并了解如何在DrawingGroup中添加和删除它们。

请记住,您要在DrawingCollection属性公开的DrawingGroup.Children中添加和删除Drawing个对象。因此,请使用DrawingGroup.Children.Add()或其他DrawingCollection方法:InsertRemoveRemoveAtClear。您需要保留添加/删除Drawing DrawingGroup对象的外部列表,以便DrawingGroup成功完成此操作。

我通过将{Image(位图)绘制到Drawing实例中的第一个子项中,然后将DrawingGroup个对象添加到Drawing DrawingGroup的实例中,使用了这种技术。为了在图形顶部层叠多边形,路径,文本等。

通过在DrawingGroup的实例中添加或删除Drawing个对象,在图像上“绘制”或“擦除”。 Drawing被视为单个DrawingGroup,因此任何缩放,平移或其他操作都会影响{{1}}中的所有{{1}}个对象。

答案 2 :(得分:1)

最有效的似乎是在我的测试中设置不透明度。另一种简单的方法是重绘受影响的视觉效果。

using (DrawingContext dc = RenderOpen()) {} //Hide this visual

然后再次显示时重绘。

渲染空白的drawingcontext似乎非常快。但是如果你有复杂的视觉效果,那么当它们变得可见时,它们可能需要花费一些时间来重新渲染它们。

答案 3 :(得分:0)

为什么不直接从视觉儿童列表中删除视觉效果?当它需要可见时,你将它添加回来。