Производительность XAML: установка альфа-канала кисти против непрозрачности FrameworkElement - PullRequest
6 голосов
/ 10 октября 2011

Для данной компоновки XAML, для которой требуется полупрозрачный белый (для обеспечения в этом случае эффекта, подобного стеклу), какой метод предпочтительнее для установки прозрачности и почему?:

  1. Установите альфа-канал кисти.Например, #12FFFFFF
  2. Установите непрозрачность самого FrameworkElement, оставив кисть на 100% белым.

Кроме того, отличается ли ответ между WPF (4.0) и Silverlight?

Ответы [ 3 ]

7 голосов
/ 10 октября 2011

Прямо от MSDN :

Непрозрачность на кистях и Непрозрачность на элементах

При использовании кисти для установки заливкиили Штрих элемента, лучше установить значение Brush.Opacity, а не свойство Opacity элемента.Изменение свойства Opacity элемента может привести к тому, что WPF создаст временную поверхность.

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

0 голосов
/ 10 октября 2011

Установка непрозрачности FrameworkElement установит непрозрачность каждого дочернего элемента этого FrameworkElement. Если FrameworkElement должен иметь дочерние элементы (кнопки, текстовые поля или любые другие элементы), вы должны перейти с опцией 1.

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

0 голосов
/ 10 октября 2011

это зависит от того, сколько объектов вы собираетесь отображать (указанного выше типа), как создается кисть и т. Д. *

Например, если кисть установлена ​​в первом примере какЗатем StaticResource он создается один раз, тогда как если он задан как строка Background = "# 12FFFFFF", то он будет создан один раз для каждого экземпляра объекта.Одно это будет влиять на производительность, хотя и незначительно

Использование Brushes.White и установка непрозрачности означает, что вы будете использовать один статический экземпляр кисти (белый) и постоянную непрозрачности, чтобы создавать меньше объектов.

Лучший способ выяснить ум - это конкретный тест. Вы проводили профилирование?

Редактировать: я должен добавить, если вы создаете только несколько из вышеперечисленных объектов, я не думаю, что вам нужно беспокоиться о производительности.Однако для 1000-х годов целесообразно провести специальный тест

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