Dans une interface WPF J'ai des noeuds connectés par des chemins de Bézier, comme ceci:WPF PathGeometry mise à jour est _SLOW_
Lorsque l'utilisateur fait glisser un nœud autour, les chemins de connexion doivent être mis à jour en réel temps. Cependant, j'ai remarqué un certain ralentissement (en particulier si un nœud est connecté à beaucoup d'autres ou si plusieurs nœuds sont déplacés en même temps). Je PROFILES, et le principal problème semble être ici:
C'est la fonction qui est appelée à chaque fois soit la propriété source ou la destination est modifiée. La géométrie qui compose le chemin semble être régénérée en interne chaque fois que l'un des points de contrôle change. Peut-être s'il y avait un moyen d'empêcher la régénération de la géométrie jusqu'à ce que toutes les propriétés de dépendance pertinentes aient été définies?
EDIT: solution Mart à utiliser StreamGeometry accéléré vers le haut de façon exponentielle; la fonction n'est nulle part proche d'un goulot d'étranglement. Un peu de réflexion suggère que PathGeometry utilise StreamGeometry en interne, et chaque fois que l'une des propriétés de dépendance est modifiée, le StreamGeometry est recalculé. Donc, cette façon coupe juste l'intermédiaire. Le résultat final est:
private void onRouteChanged()
{
Point src = Source;
Point dst = Destination;
if (!src.X.isValid() || !src.Y.isValid() || !dst.X.isValid() || !dst.Y.isValid())
{
_shouldDraw = false;
return;
}
/*
* The control points are all laid out along midpoint lines, something like this:
*
* --------------------------------
* | | | |
* | SRC | CP1 | |
* | | | |
* --------------------------------
* | | | |
* | | MID | |
* | | | |
* -------------------------------
* | | | |
* | | CP2 | DST |
* | | | |
* --------------------------------
*
* This causes it to be horizontal at the endpoints and vertical
* at the midpoint.
*/
double mx = (src.X + dst.X)/2;
double my = (src.Y + dst.Y)/2;
Point mid = new Point(mx, my);
Point cp1 = new Point(mx, src.Y);
Point cp2 = new Point(mx, dst.Y);
_geometry.Clear();
_shouldDraw = true;
using(StreamGeometryContext ctx = _geometry.Open())
{
ctx.BeginFigure(src, false, false);
ctx.QuadraticBezierTo(cp1, mid, true, false);
ctx.QuadraticBezierTo(cp2, dst, true, false);
}
}
Le code source du projet est disponible à http://zeal.codeplex.com pour les curieux.
Merci; passer à StreamGeometry semblait résoudre le problème! –