Производительность полупрозрачного окна на нескольких экранах при перемещении прямоугольника в реальном времени - PullRequest
3 голосов
/ 07 февраля 2011

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

. В этом окне пользователь может перетащить прямоугольник мышью.Когда кнопка мыши отпущена, делается снимок экрана с данной областью.(Что-то похожее на инструмент для разрезания в windows 7)

Для этого в окне содержится RectangleGeometry.

Теперь в событии CompositionTarget.Rendering прямоугольник, в котором указывается место, где находитсяМышь была, когда мышь находилась внизу, она также имеет размер, чтобы охватить область до текущей позиции мыши.

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

Разрешение дисплея ноутбука составляет 1600x1200

Подключенный дисплей имеет разрешение 1900x1200

Также приподключив дисплей, он изменил основной экран на новый

Вот определение окна

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        AllowsTransparency="True" Background="Transparent" WindowStyle="None" >

the geometry definition
<Path Fill="Black" Opacity="0.4" Stroke="Red" StrokeThickness="3">
   <Path.Data>
       <RectangleGeometry  x:Name="Inner" Rect="105,5,90,90"/>
   </Path.Data>
</Path>

Здесь часть кода, которая перемещает прямоугольник

System.Windows.Rect location = new System.Windows.Rect(this.DragStart.X, this.DragStart.Y, width, height);

this.Inner.Rect = rect;

У кого-нибудь есть идеи, как улучшить производительность?«Нормально» ли это, что производительность сильно снижается при высоких разрешениях на нескольких дисплеях?

1 Ответ

2 голосов
/ 22 мая 2011

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

У нас обычно есть главное окно приложения, охватывающее 3-4 экрана 1920x1200.При использовании нескольких экранов наблюдается заметное (но допустимое) падение производительности по сравнению с одним экраном.

Мы обнаружили, что использование режима win XP span или win7 мозаичного режима NVIDIA позволило значительно снизить падение производительности (у нас есть полный контроль надсреда выполнения).

Обратите внимание, что нам пришлось отключить AllowsTransparency для главного окна - когда эта опция была включена, падение производительности было недопустимым!

Также попробуйте принудительно выполнить программный рендеринг - это может вас удивить(и, по моему опыту, это единственный способ обеспечить стабильную многоэкранную WPF-среду без артефактов в Win XP, особенно в сочетании с любой графической картой NVIDIA quadro).

...