2011-02-07 1 views
3

J'ai une petite application qui affiche une fenêtre semi-transparente sur l'ensemble du bureau. La fenêtre n'apparaît pas dans la barre des tâches et n'a pas de barre de titrePerformance d'une fenêtre semi-transparente sur plusieurs écrans lors du déplacement d'un rectangle en temps réel

Sur cette fenêtre, l'utilisateur peut faire glisser un rectangle avec la souris. Lorsque le bouton de la souris est relâché, une capture d'écran de la zone donnée est prise. (Quelque chose comme l'outil d'extraction dans Windows 7)

Pour ce faire, la fenêtre contient un RectangleGeometry.

Désormais, dans l'événement CompositionTarget.Rendering, le rectangle défini à l'emplacement où se trouvait la souris lorsque la souris s'est abaissée est également dimensionné pour couvrir la zone jusqu'à la position actuelle de la souris.

Cela fonctionne très bien tant qu'un seul moniteur est connecté. Lorsqu'un second moniteur avec une résolution supérieure est connecté, les performances diminuent considérablement.

La résolution de l'écran d'ordinateur portable est 1600x1200

L'écran qui est connecté a 1900x1200

également lors de la connexion de l'affichage, il a changé l'écran principal vers le nouveau

Heres la définition de la fenêtre

<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> 

Ici une partie du code qui déplace le rectangle

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

this.Inner.Rect = rect;

Est-ce que quelqu'un a une idée sur la façon d'améliorer la performance? Est-il "normal" que la performance diminue autant sur des résolutions plus élevées avec plusieurs écrans?

+0

J'ai découvert que la performance augmente lorsque la fenêtre devient plus petite. On dirait que c'est plus lié à la taille que l'écran secondaire. Est-ce que quelqu'un sait si les grands écrans sont un problème pour WPF? –

Répondre

2

Tout d'abord, je ne suis pas sûr que le CompositionTarget.Rendering est l'outil idéal pour le travail - il pourrait être la cause plus de dégâts que de bien - essayez d'utiliser simple rectange dans une toile ...

Nous ont généralement une fenêtre d'application principale couvrant 3-4 écrans 1920x1200. Il y a une baisse notable (mais tolérable) des performances lors de l'utilisation de plusieurs écrans par rapport à un écran. Nous avons constaté que l'utilisation du mode span win XP ou du mode de mosaïque win7 NVIDIA permettait de réduire considérablement les pertes de performances (nous maîtrisons totalement l'environnement d'exécution).

Notez que nous avons dû désactiver AllowsTransparency pour la fenêtre principale - lorsque cette option était activée, la baisse de performance n'était pas tolérable! Essayez aussi de forcer le rendu logiciel - cela pourrait vous surprendre (et d'après mon expérience, c'est la seule façon de garantir un environnement WPF multi-écrans stable et sans artefact dans win XP, en particulier avec n'importe quelle carte graphique quadri NVIDIA).