DrawingVisual производительность с непрозрачностью = 0 - PullRequest
3 голосов
/ 12 ноября 2008

Если у меня есть DrawingVisual в WPF с Opacity = 0, этого достаточно, чтобы его не рисовать? У нас есть сотни DrawingVisuals на Canvas, и в настоящее время мы устанавливаем непрозрачность = 0 для визуальных элементов, которые не должны отображаться, и я хотел убедиться, что нет никакого снижения производительности рендеринга для визуализации DrawingVisual с Opacity = 0.

ОБНОВЛЕНИЕ: во время тестирования я обнаружил, что при непрозрачности = 0 возникают издержки IS, но поскольку у DrawingVisual нет свойства Visibility, я не знаю, как иначе вы бы сказали, что он не будет отображаться, если вы действительно не удалите его из визуального дерева, поэтому любые предложения приветствуются.

Ответы [ 4 ]

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

Я решил очень похожую проблему, используя DrawingGroup и добавляя или удаляя Drawing объекты из DrawingGroup, поскольку их либо нужно было отобразить, либо скрыть. Ключ заключается в том, чтобы организовать ваши Drawing объекты таким образом, чтобы ими было легко управлять, и чтобы понять, как добавлять и удалять их из DrawingGroup.

Помните, что вы хотите добавить и удалить объекты Drawing из DrawingCollection, предоставляемого свойством DrawingGroup.Children. Поэтому используйте DrawingGroup.Children.Add() или другие DrawingCollection методы: Insert, Remove, RemoveAt, Clear. Вам нужно будет сохранить внешний список Drawing объектов, которые вы добавляете / удаляете в DrawingGroup, чтобы сделать это успешно.

Я использовал эту технику, чтобы добиться большого эффекта, нарисовав изображение (растровое изображение) в первом дочернем элементе в моем экземпляре DrawingGroup, а затем добавив и удалив объекты Drawing в этот экземпляр DrawingGroup для наложения многоугольников, контуры, текст и т. д. поверх рисунка.

Я "рисую" или "стираю" изображение, добавляя или удаляя Drawing объекты к экземпляру DrawingGroup. DrawingGroup обрабатывается как один Drawing, поэтому любое масштабирование, панорамирование или другие манипуляции будут влиять на все Drawing объекты в пределах DrawingGroup.

2 голосов
/ 14 ноября 2008

Лучший способ проверить это - вместо этого установить Visibility в Visibility.Colapsed и посмотреть, есть ли какие-либо различия в производительности чертежа.

Visibility.Colapsed гарантирует, что элемент не виден, но также и что он не будет участвовать в проходах пользовательского интерфейса "Упорядочить", "Измерить" и "Отрисовать", в то время как элемент с Opacity = 0 может участвовать во всех проходах.

1 голос
/ 10 августа 2012

Самым эффективным представляется установить непрозрачность в моих тестах. Другой простой подход - перерисовать визуальные элементы, на которые они влияют.

using (DrawingContext dc = RenderOpen()) {} //Hide this visual

А затем перерисовать, когда они снова станут видимыми.

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

0 голосов
/ 28 мая 2009

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

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