Why does use of pens with dash patterns cause huge (!) performance degredation in WPF custom 2D drawing?

妖精的绣舞 提交于 2019-11-30 15:26:49

Are the pens getting frozen? Freezing drawing objects helps performance a lot.

You could set up a Loaded handler and debug to see if your pens are frozen. If not, Call the Pen.Freeze() button manually on them.

Note that freeze also makes the pens read-only... you will be unable to modify them after you freeze them.

Here's a possible workaround - if you're only drawing horizontal and/or vertical lines you could try creating your Pen with a checker pattern DrawingBrush such as:

  <Pen x:Key="PenUsingDashPatterns" Thickness="1">
        <Pen.Brush>
            <DrawingBrush TileMode="Tile" 
                          Viewport="0 0 6 6" ViewportUnits="Absolute">
                <DrawingBrush.Drawing>
                    <GeometryDrawing Brush="Black">
                        <GeometryDrawing.Geometry>
                            <GeometryGroup>
                                <RectangleGeometry  Rect="0 0 3 3"/>
                                <RectangleGeometry  Rect="3 3 3 3"/>
                            </GeometryGroup>
                        </GeometryDrawing.Geometry>
                    </GeometryDrawing>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </Pen.Brush>
    </Pen>   

Alternatively, you could use different brushes for verical and horizontal lines, or, possibly, an ImageBrush for better performance.

You should use Perforator to dig deeper into the performance issue. Here's a link to the MSDN site talking about various WPF performance tools. Perforator would probably be the tool that will help you the most, specially in determining if the lines are being drawn using the software renderer (which would be the greatest factor in giving you such bad performance).

If the problem is that they are being drawn in software, you might have to write your own ShaderEffect, but that will probably get tricky fast unless you are familiar with HLSL.

Most likely this is because this particular draw operation isn't something that can be delegated to the video card, which would force composition in memory and blitting to the video card.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!