2010-03-20 3 views
2

Je travaille sur un projet d'organigramme (SL 3) et je vois le thread de l'interface utilisateur se bloquer lorsque le graphique est construit autour de 2000 nœuds et quand il rend cela prend environ un min puis FPS tomber à un crawl.Silverlight performance avec un grand nombre d'objets Organigramme

Voici le flux de code. Page.xaml.cs appelle un service wcf qui renvoie une liste d'utilisateurs AD. Ensuite, nous utilisons Linq pour construire une collection de nœuds à lier à l'Orgchart.cs

OrgChart.cs est un canevas et affiche une collection de nœuds et de lignes de connexion.

Node.cs est un canevas et ses données utilisateur peuvent contenir des nœuds enfants. NodeContent.xaml est un contrôle utilisateur qui a des bordures afin que je puisse définir l'arrière-plan, les blocs de texte pour afficher les données de l'utilisateur, les événements qui gèrent les nœuds sélectionnés et expansés et les storyboards qui redimensionnent les nœuds lorsqu'ils sont sélectionnés ou développés. remarqué pendant les heures de débogage, ici dans InitializeComponent(); section où il charge le xaml, il semble être là où le coup de préformance se passe.

System.Windows.Application.LoadComponent (this, nouveau System.Uri ("/ Silverlight.Custom; component/NodeContent.xaml", System.UriKind.Relative));

Donc je suppose que j'ai deux questions.

  1. L'aide de thread peut-elle être suspendue pendant que vous dessinez les nœuds?
  2. Comment puis-je éviter le hit lors de l'appel de ce contrôle utilisateur?

Tout conseil ou direction que quelqu'un peut prêter serait grandement apprécié.

Merci, KC

Répondre

0

En ce qui faire quelque chose avec le filetage de l'interface utilisateur va vous mènera nulle part. Vous pouvez peut-être effectuer un massage des données sur les threads d'arrière-plan, mais si vous manipulez des objets qui sont liés à l'interface utilisateur sur un thread d'arrière-plan, vous recherchez des problèmes. Vous devrez vraiment séparer ce travail de l'interface utilisateur, puis l'invoquer de nouveau.

Je pense que Siverlight prend simplement du temps pour dessiner tous les nœuds. Nous avons une application qui attire environ 100 widgets assez riches. Seuls 20 ou 30 widgets sont visibles dans un hôte ItemsControl un panneau de retour à la ligne. Nous avons fini par obtenir de meilleures performances en utilisant un panneau de retour à la virtualisation, qui n'instancie pas réellement les éléments cachés de l'interface utilisateur tant qu'ils ne sont pas nécessaires. Il y a quelques compromis ici, et nous travaillons toujours le problème, mais la page charge plus vite de cette façon. Vous pouvez utiliser une stratégie similaire pour dessiner vos nœuds, en chargeant uniquement les nœuds qui doivent être visibles. En outre, vous pouvez charger des parties de l'arbre sur la surface de dessin en morceaux. Peut-être prendre les 100 premiers enregistrements et les dessiner, puis dessiner les 100 suivants, etc.

1

Cela me semble que votre interface utilisateur a un point naturel pour comparer la charge en chargeant l'interface utilisateur pour les nœuds à la demande.

Vous avez des nœuds qui peuvent être développés et réduits. Ne chargez l'interface utilisateur que pour les noeuds actuellement développés. Lorsque l'utilisateur développe un nœud, chargez l'interface utilisateur pour ses nœuds enfants à ce stade.

Questions connexes