Почему использование перьев с шаблонами штрихов приводит к значительному (!) Снижению производительности в пользовательском 2D-чертеже WPF? - PullRequest
4 голосов
/ 11 февраля 2009

Надеюсь, кто-нибудь может пролить свет на это, чтобы я мог использовать ручки с рисунками тире?

Я пишу прокручиваемую диаграмму (Panel внутри ScrollViewer, которая реализует IScrollInfo) в WPF, используя DrawingVisual s DataContext.Draw X . У меня есть несколько тысяч DrawingVisual, которые прокручиваются с помощью TranslateTransform на Panel, который их размещает. Я реализовал сетку, поместив Panel поверх нее и нарисовав простые горизонтальные линии от одного края к другому, используя DataContext.DrawLine(pen, new Point(0, y), new Point(widthOfPanel, y)); // (примечание: эти линии всегда статичны, они никогда не двигаются).

Производительность прокрутки абсолютно безумна (то есть DrawingVisual отрисовывается мгновенно, а прокрутка - мгновенная). Но если я использую Pen, который использует штриховые шаблоны (см., Например, ниже) для рисования линий сетки, то прокрутка очень прерывистая, и производительность, похоже, снизилась в 100 раз (оценка). Кто-нибудь может объяснить, почему это происходит и как я могу обойти это?

Пример пера с тире:

<Pen x:Key="PenUsingDashPatterns" Brush="Black" Thickness="1">
   <Pen.DashStyle >
      <DashStyle Dashes="3, 3" />
   </Pen.DashStyle>
</Pen>

Ответы [ 4 ]

6 голосов
/ 13 апреля 2009

Вот возможный обходной путь - если вы рисуете только горизонтальные и / или вертикальные линии, вы можете попробовать создать Pen с шаблоном проверки DrawingBrush, например:

  <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>   

В качестве альтернативы, вы можете использовать разные кисти для вертикальных и горизонтальных линий или, возможно, ImageBrush для лучшей производительности.

3 голосов
/ 13 апреля 2009

Вы должны использовать Perforator, чтобы углубиться в проблему производительности. Вот ссылка на сайт MSDN, рассказывающая о различных инструментах производительности WPF . Perforator, вероятно, будет инструментом, который поможет вам больше всего, особенно в определении, будут ли линии нарисованы с помощью программного рендерера (что будет самым большим фактором, обеспечивающим вам такую ​​плохую производительность).

Если проблема в том, что они рисуются в программном обеспечении, вам, возможно, придется написать свой собственный ShaderEffect , но это, вероятно, будет сложно быстро, если вы не знакомы с HLSL.

3 голосов
/ 11 февраля 2009

Ручки замерзают? Замораживание рисованных объектов очень помогает в производительности.

Вы можете настроить обработчик Loaded и отладку, чтобы увидеть, не заморожены ли ваши ручки. Если нет, нажмите на них кнопку Pen.Freeze () вручную.

Обратите внимание, что замораживание также делает ручки доступными только для чтения ... вы не сможете изменять их после замораживания.

2 голосов
/ 08 апреля 2009

Скорее всего, это связано с тем, что данная конкретная операция рисования не может быть делегирована на видеокарту, что приведет к наложению композиции в памяти и к разрыву видеокарты.

...