为什么使用带有破折号模式的笔会在WPF自定义2D绘图中导致巨大的(!)性能降级?

希望任何人都可以阐明这一点,以便我可以使用带有破折号模式的笔?

我正在使用IScrollInfoDataContext.Draw X在WPF中编写一个可滚动的图表(一个实现IScrollInfo ScrollViewer中的IScrollInfo )。 我有几千个DrawingVisual可以通过在托管它们的Panel上使用TranslateTransform来滚动。 我通过在它上面放置一个Panel并使用DataContext.DrawLine(pen, new Point(0, y), new Point(widthOfPanel, y));从一个边缘到另一个边缘绘制简单的水平线来实现网格DataContext.DrawLine(pen, new Point(0, y), new Point(widthOfPanel, y)); //(注意:这些线总是静态的,它们永远不会移动)。

滚动表现绝对疯狂(即立即绘制DrawingVisual并立即滚动)。 但是如果我使用一个使用破折号模式的Pen (例如见下面)来绘制网格线,那么滚动非常不稳定并且性能似乎已降低了100倍(估计值)。 谁能解释为什么会发生这种情况以及如何解决这个问题?

带划线图案的笔示例:

      

笔是否冻结? 冻结绘图对象有助于提高性能。

您可以设置一个Loaded处理程序并进行调试,以查看您的笔是否已冻结。 如果没有,请手动调用Pen.Freeze()按钮。

请注意,冻结也会使笔变为只读…冻结后您将无法修改它们。

这是一个可能的解决方法 – 如果您只绘制水平和/或垂直线,您可以尝试使用检查器模式DrawingBrush创建Pen ,例如:

                  

或者,您可以使用不同的画笔用于垂直和水平线,或者可能使用ImageBrush以获得更好的性能。

您应该使用Perforator深入挖掘性能问题。 这是MSDN网站的链接,讨论各种WPF性能工具 。 穿孔器可能是最能帮助您的工具,特别是在确定是否使用软件渲染器绘制线条时(这将是给您如此糟糕性能的最大因素)。

如果问题是它们是用软件绘制的,你可能必须编写自己的ShaderEffect ,但除非你熟悉HLSL,否则这可能会很快变得棘手。

很可能这是因为这种特殊的绘制操作不能委托给video卡,这会迫使内存中的合成和video卡的blitting。