WPF canvas performance- children.add вызывался много раз - PullRequest
6 голосов
/ 31 января 2011

Я рисую много линий на длинном холсте (например, на полосчатой ​​диаграмме) и достаточно хорошо настроил его на производительность, используя низкоуровневые классы геометрии, замораживая их и т. Д. Это значительно улучшило производительность, но все равно требуетнесколько секунд, чтобы загрузить несколько тысяч предметов в холст.Я выполнил анализ производительности приложения, и похоже, что каждый вызов занимает canvas.children.add() большой процент времени.Я читал, что это должен быть легкий вызов, и так как я вызываю его много раз в одном методе, он не должен пытаться сделать что-то тяжелое между ними ... Может быть, есть какая-то другая причина, по которой это может потребоватьсяТак много времени?И как бы я мог ускорить это?

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

Просто для справки, похоже, что в этом примере он вызывается 1400 раз, и на современном / быстром ноутбуке это занимает почти 3 секунды процессорного времени.

Хотя холст содержится в иерархии других элементов управления, поэтому мне любопытно, могут ли они способствовать этому.

Дополнительное примечание: я также не устанавливаю конкретную высоту на холсте, так как она настроена для заполнения родительского контейнера сетки.Может ли это быть источником проблем?

Ответы [ 3 ]

5 голосов
/ 06 апреля 2011

Основная проблема в том, что Children.Add всегда медленная операция, даже если вы используете объекты StreamGeometry. Недавно я столкнулся с той же проблемой и пришел к следующему выводу: Если вы поместите несколько объектов в новый холст и вложите его в основной холст, производительность операции добавления будет значительно увеличена. Таким образом, вместо добавления 1400 элементов, поместите 200 элементов в 7 холстов и добавьте эти 7 холстов к основному холсту. Поскольку все объекты теперь принадлежат разным холстам, вам нужно будет немного настроить свое приложение, но это будет менее радикальным решением, чем переход к альтернативному решению, например DrawingVisual

1 голос
/ 03 апреля 2011

Просто добавьте иерархию элементов управления, в которой находится холст, и высоту холста:

Canvas всегда занимает столько места, сколько ему дано, и независимо от того, какие дочерние элементы вы добавляете к нему -это НИКОГДА не вызывает новую передачу Измерения / Аранжировки на своих родителей.поэтому то, что вы делаете внутри холста, никогда не может повлиять на визуальное дерево, в котором оно содержится. Подводя итог, проблема не может возникнуть, и предложение о StreamGeomatry совершенно верно - это то, что вызывает проблемы с производительностью, ипереход на streamgeormatry решит это.

0 голосов
/ 03 апреля 2011

Я бы посоветовал вам рисовать фигуры непосредственно на изображении, а не добавлять их в качестве детей. Рендеринг детей имеет ОГРОМНЫЕ накладные расходы (как вы можете видеть).

Есть похожий вопрос со ссылкой на некоторые полезные статьи:

Как нарисовать линию из десяти тысяч точек с WPF в течение 0,5 секунды?

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