Подтвердить что ты не робот

Производительность DrawingVisual vs Canvas.OnRender для множества постоянно изменяющихся форм

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

Однако в статье предлагается, что наиболее эффективным подходом для постоянно движущихся фигур является использование больших экземпляров DrawingVisual вместо OnRender. К сожалению, хотя это не объясняет, почему это должно быть быстрее для этого сценария.

Изменение реализации таким образом не является небольшим усилием, поэтому я хотел бы понять причины и применимы ли они ко мне, прежде чем принимать решение об этом. Почему подход DrawingVisual приводит к более низкому использованию ЦП, чем подход OnRender в этом сценарии?

4b9b3361

Ответ 1

Я думал, что Петцольд объясняет в этом параграфе:

Класс ScatterPlotVisual работает создание объекта DrawingVisual для каждый DataPoint. Когда свойства изменение объекта DataPoint, класс требуется только изменить DrawingVisual связанные с этим DataPoint.

который основывается на более раннем объяснении;

Всякий раз, когда свойство ItemsSource изменения или изменения коллекции, или свойство объектов DataPoint в изменения коллекции, Вызов ScatterPlotRender InvalidateVisual. Это создает вызовите OnRender, который рисует весь график рассеяния.

Это то, о чем вы спрашиваете?

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

Ответ 2

Из Pro WPF в С# 2008:

Проблема, поставленная этими приложений не сложность искусство, но огромное количество отдельные графические элементы. Даже если вы заменяете элементы Path на Геометрические объекты с меньшим весом накладные расходы по-прежнему будут препятствовать производительность приложения. WPF решение такого рода ситуации для использования визуального уровня нижнего уровня модель. Основная идея заключается в том, что вы определить каждый графический элемент как Визуальный объект, который является чрезвычайно легкий ингредиент, который имеет меньше накладные расходы, чем объект геометрии или Объект Path.

Что сводится к тому, что каждый из этих эллипсов и линий, которые вы создаете, является отдельным FrameworkElement; это означает, что он поддерживает не только тестирование, но и макет, ввод, фокус, события, стили, привязку данных, ресурсы и анимацию. Это довольно тяжелый объект для того, что вы пытаетесь сделать! Объект Visual пропускает все это и наследует непосредственно из DependencyObject. Он по-прежнему обеспечивает поддержку для тестирования ударов, преобразования координат и вычислений с ограничивающей коробкой, но ни один из других элементов, поддерживаемых формами. Это гораздо более легкий и, вероятно, значительно улучшит вашу производительность.

EDIT:

Хорошо, я неправильно понял ваш вопрос в первый раз.

В случае, если вы используете OnRender, это действительно зависит от того, как вы создаете визуальные эффекты и отображаете их. Если вы используете DrawingContext и добавляете все визуальные эффекты в один элемент, это ничем не отличается от подхода DrawingVisual. Если вы создавали отдельный элемент для каждого созданного Visual, это было бы проблемой. Мне кажется, что вы делаете все правильно.

Ответ 3

В ответах все ответили неправильно. Возникает вопрос, быстрее ли рисовать фигуры непосредственно в контексте рисования, чем создание DrawingVisual. Ответ, очевидно, "да". Такие функции, как DrawLine, DrawEllipse, DrawRectangle и т.д., Не создают элемент UI. DrawingVisual намного медленнее, потому что он создает элемент пользовательского интерфейса, хотя и легкий. Путаница в ответах заключается в том, что люди просто копируют/вставляют DrawingVisual, лучше, чем отдельный оператор формы UIElement из MSDN.

Ответ 4

В моих тестах (анимация панорамирования) я не вижу разницы в скорости. Я бы сказал, что использование элемента хоста для многих графических визуальных изображений немного быстрее. Такой подход, при котором вы создаете свое визуальное дерево со многими визуальными эффектами, дает вам больше контроля. Более того, когда вы хотите выполнить сложное тестирование, процесс фильтрации выполняется быстрее, потому что вы можете пропускать целые "ветки" визуальных изображений