WPF - улучшения графической производительности ScreenSaver - PullRequest
2 голосов
/ 16 марта 2009

Я взял этот шаблон WPF-VS2008 ScreenSaver и начал делать новую заставку. У меня есть некоторый опыт работы с заставками на WinForms-платформе (GDI +), поэтому я немного растерялся с WPF.

  1. Фон-элемент для моей заставки - Canvas.
  2. Тик DispatcherTimer установлен на 33 мсек, что составляет ~ 30 FPS.
  3. Цвет фона - это всего лишь одна огромная кисть LinearGradientBrush.
  4. На экране, который у меня есть (для каждого доступного экрана, на моем локальном компьютере, у меня есть 2) n-эллипсы, нарисованные случайным образом (инициализация) цвета фона + альфа-канал. Все они находятся в детской коллекции Canvas.
  5. Я перемещаю эти эллипсы по экрану с некоторой логикой (каждый тик DispatcherTimer). Я делаю движение для каждого эллипса, а затем просто вызываю Canvas.SetLeft (...) и Canvas.SetTop (...) для каждого эллипса.
  6. Если N (количество эллипсов) больше> 70-80, я начинаю замечать замедление графики.

Теперь, мне интересно, могу ли я что-нибудь сделать, чтобы улучшить графическую гладкость при выборе более высоких N-значений? Могу ли я «заморозить» «что-то» перед тем, как переместить мои эллипсы, и «разморозить» «что-то», когда я закончу? Или есть какой-то другой трюк, который я мог бы сделать?

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

Ответы [ 3 ]

4 голосов
/ 27 марта 2009

Вы пробовали рендеринг в событии CompositionTarget.Rendering, а не в таймере? Я получил впечатляющую производительность в 3D-заставке при использовании события Rendering и собственной двойной буферизации. (См. http://stuff.seans.com/2008/08/21/simple-water-animation-in-wpf/, http://stuff.seans.com/2008/08/24/raindrop-animation-in-wpf/ и http://stuff.seans.com/2008/09/01/writing-a-screen-saver-in-wpf/)

0 голосов
/ 16 марта 2009

Вы улучшите производительность, если вызовете метод Freeze для объектов, которые наследуются от Freezable - например, кисти.

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

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

0 голосов
/ 16 марта 2009

Невозможно разморозить что-либо после того, как оно было заморожено (хотя копия объекта по умолчанию не откреплена). Двойная буферизация также включена по умолчанию в WPF, поэтому вы не можете получить здесь.

Один из способов повысить производительность, если это еще не сделано, - это использовать геометрические объекты , такие как Эллиптическая геометрия , а не фигуры, если вам не нужны все события, так как они легкий вес.

Я также нашел эту статью MSDN Оптимизация производительности: 2D-графика и обработка изображений , которая предполагает, что CachingHint может помочь наряду с некоторыми другими советами.

Наконец, убедитесь, что вы используете последний пакет обновления 1, так как он имеет много улучшений производительности обрисовано в общих чертах здесь

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