DrawingBrush всегда отображается на процессоре (не на GPU)?

Я борюсь с некоторыми проблемами производительности WPF. Профилировщик Ants и dotTrace показывают, что все время находится глубоко во внутренностях WPF. У меня есть несколько объектов DrawingBrush в настоящее время в использовании. Старый WpfPerf.exe показывает, что мои объекты DrawingBrush отображаются на процессоре, а не на графическом процессоре. Что я могу сделать, чтобы изменить это? Ниже приведен пример одного. Почему он рендерится на стороне процессора?

<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 ответ

Решение

После прочтения я нашел несколько источников, предлагающих использовать 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>
Другие вопросы по тегам