Нужно ли беспокоиться об оптимальном рисовании на холсте? - PullRequest
3 голосов
/ 19 октября 2011

Я должен нарисовать график на холсте (связан с прокруткой).И в памяти есть около 200 или около того узлов.

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

Но я не создал линии между узлами.Из MSDN я знаю, что

На первый взгляд класс Geometry и класс Shape очень похожи.Оба используются при рендеринге 2D-графики, и оба имеют схожие конкретные классы, которые происходят от них, например, EllipseGeometry и Ellipse.Однако между этими двумя наборами классов существуют важные различия.С одной стороны, в классе Geometry отсутствуют некоторые функциональные возможности класса Shape, например, возможность рисовать себя.

Поскольку может быть намного больше узлов, система может отображать вещи медленно.Поэтому для повышения производительности я считаю, что лучшим выбором будет геометрия (пользовательский рендеринг).

Мои вопросы:

  1. Должен ли я использовать Shape или Geometryрисовать линии?

  2. Должен ли я отображать только текущую область видового экрана средства просмотра прокрутки, чтобы ускорить отображение (в этом случае мне пришлось бы преобразовать узлыот элементов управления до геометрических объектов), или я должен просто перебрать ВСЕ узлы и нарисовать линии между ними?

  3. Должен ли я отображать график в памяти на растровом изображенииа потом перевернуть?Это больше похоже на программирование игр, чем на общее программирование приложений!: D

  4. Разве WPF автоматически не выполняет рендеринг того, что видно, а что не для лучшей производительности?

1 Ответ

2 голосов
/ 19 октября 2011

Несколько моментов, чтобы обдумать ...

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

Ну, это выглядит нормально для меня, однако Canvas никогда не виртуализируется. Я рекомендую перейти на сайт Codeplex и загрузить исходный код WPFToolkit. В DataVisualization пространстве имен у вас есть несколько элементов управления диаграммами (даже ScatterredChart, которые похожи на ваши, где линии не рисуются между узлами) и их исходный код. Посмотрите, что они сделали. Как они увеличили производительность своих графических инструментов.

Я также натолкнулся на эту статью о том, как реализовать Scrollable Virtualized Canvas . Вероятно, это поможет вам добиться быстрой визуализации узлов поверх canvas.

Лично ...

1] Геометрии легки, и они мне нравятся.

2] Визуальное HitTesting может помочь вам понять, находится ли элемент в области рендеринга, то есть в пределах представления прокрутки. В противном случае сделайте его скрытым, чтобы он не рисовал сам себя. «Скрытый», а не «Свернутый», потому что режим работы с прокруткой будет работать нормально.

3] Я помню, как мой коллега использовал даже виртуализированную стековую панель с горизонтальной ориентацией, чтобы она отображала узлы, и вид блока , то есть область, специфичная для одной точки на оси X, чтобы такие повторяющиеся области автоматически помещались вместе, чтобы получить монолитный график.

Замечательно, что имплементация была!

Всего наилучшего и держите нас в курсе ваших успехов в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...