DrawingBrush总是在CPU(而不是GPU)上渲染?

时间:2014-09-29 15:42:37

标签: wpf performance xaml drawingbrush

我正在努力解决一些WPF性能问题。蚂蚁分析器和dotTrace都表明WPF内部的所有时间都很深。我目前正在使用许多DrawingBrush对象。旧的WpfPerf.exe显示我的DrawingBrush对象正在CPU而不是GPU上呈现。有什么我可以做的改变吗?以下是一个例子。为什么它会渲染CPU端?

<DataTemplate DataType="mapViewModel:ObstacleVM" x:Key="ObstacleShapeTemplate">
    <Path Stroke="{DynamicResource Mobius.UI.Resources.Colors.ObstacleShapeOutlineBrush}" StrokeThickness="{Binding WorldAndScreen.MetersPerPixel, Converter={StaticResource Multiplier}, ConverterParameter=1}" StrokeLineJoin="Bevel" StrokeEndLineCap="Square" StrokeStartLineCap="Flat">
        <Path.Fill>
            <DrawingBrush Stretch="Uniform" ViewportUnits="Absolute" TileMode="Tile">
                <DrawingBrush.Transform>
                    <ScaleTransform ScaleY="{Binding WorldAndScreen.MetersPerPixel, Converter={StaticResource Multiplier}, ConverterParameter=5}" />
                </DrawingBrush.Transform>
                <DrawingBrush.Drawing>
                    <DrawingGroup>
                        <DrawingGroup.Children>
                            <GeometryDrawing Brush="{DynamicResource Mobius.UI.Resources.Colors.ObstacleShapeFillBrush}">
                                <GeometryDrawing.Geometry>
                                    <GeometryGroup FillRule="Nonzero">
                                        <PathGeometry>
                                            <PathFigure StartPoint="0,0">
                                                <LineSegment Point="1,0" />
                                                <LineSegment Point="1,1" />
                                                <LineSegment Point="0,1" />
                                            </PathFigure>
                                        </PathGeometry>
                                    </GeometryGroup>
                                </GeometryDrawing.Geometry>
                            </GeometryDrawing>
                            <GeometryDrawing Brush="{DynamicResource Mobius.UI.Resources.Colors.ObstacleShapeOutlineBrush}">
                                <GeometryDrawing.Geometry>
                                    <GeometryGroup FillRule="Nonzero">
                                        <PathGeometry>
                                            <PathFigure StartPoint="0,0">
                                                <LineSegment Point="0,.33" />
                                                <LineSegment Point="1,.33" />
                                                <LineSegment Point="1,0" />
                                            </PathFigure>
                                        </PathGeometry>
                                    </GeometryGroup>
                                </GeometryDrawing.Geometry>
                            </GeometryDrawing>
                        </DrawingGroup.Children>
                    </DrawingGroup>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </Path.Fill>
        <Path.Data>
            <PathGeometry FillRule="Nonzero" Figures="{Binding Figures, FallbackValue={StaticResource DefaultFigures}}" />
        </Path.Data>
    </Path>
</DataTemplate>

1 个答案:

答案 0 :(得分:0)

在进一步阅读之后,我发现一些消息来源暗示使用VisualBrish。实际上,我试过这个并且它似乎解决了它(再次,根据WpfPerf.exe)。

<DataTemplate DataType="mapViewModel:ObstacleVM" x:Key="ObstacleShapeTemplate">
    <Path Stroke="{DynamicResource Mobius.UI.Resources.Colors.ObstacleShapeOutlineBrush}" StrokeThickness="{Binding WorldAndScreen.MetersPerPixel, Converter={StaticResource Multiplier}, ConverterParameter=1}" StrokeLineJoin="Bevel" StrokeEndLineCap="Square" StrokeStartLineCap="Flat">
        <Path.Fill>
            <VisualBrush Stretch="Uniform" ViewportUnits="Absolute" TileMode="Tile">
                <VisualBrush.Transform>
                    <ScaleTransform ScaleY="{Binding WorldAndScreen.MetersPerPixel, Converter={StaticResource Multiplier}, ConverterParameter=5}" />
                </VisualBrush.Transform>
                <VisualBrush.Visual>
                    <Image Stretch="None">
                        <Image.Source>
                            <DrawingImage>
                                <DrawingImage.Drawing>
                                    <DrawingGroup>
                                        <DrawingGroup.Children>
                                            <GeometryDrawing Brush="{DynamicResource Mobius.UI.Resources.Colors.ObstacleShapeFillBrush}">
                                                <GeometryDrawing.Geometry>
                                                    <GeometryGroup FillRule="Nonzero">
                                                        <PathGeometry>
                                                            <PathFigure StartPoint="0,0">
                                                                <LineSegment Point="1,0" />
                                                                <LineSegment Point="1,1" />
                                                                <LineSegment Point="0,1" />
                                                            </PathFigure>
                                                        </PathGeometry>
                                                    </GeometryGroup>
                                                </GeometryDrawing.Geometry>
                                            </GeometryDrawing>
                                            <GeometryDrawing Brush="{DynamicResource Mobius.UI.Resources.Colors.ObstacleShapeOutlineBrush}">
                                                <GeometryDrawing.Geometry>
                                                    <GeometryGroup FillRule="Nonzero">
                                                        <PathGeometry>
                                                            <PathFigure StartPoint="0,0">
                                                                <LineSegment Point="0,.33" />
                                                                <LineSegment Point="1,.33" />
                                                                <LineSegment Point="1,0" />
                                                            </PathFigure>
                                                        </PathGeometry>
                                                    </GeometryGroup>
                                                </GeometryDrawing.Geometry>
                                            </GeometryDrawing>
                                        </DrawingGroup.Children>
                                    </DrawingGroup>
                                </DrawingImage.Drawing>
                            </DrawingImage>
                        </Image.Source>
                    </Image>
                </VisualBrush.Visual>
            </VisualBrush>
        </Path.Fill>
        <Path.Data>
            <PathGeometry FillRule="Nonzero" Figures="{Binding Figures, FallbackValue={StaticResource DefaultFigures}}" />
        </Path.Data>
    </Path>
</DataTemplate>