WPF UIには、次のようにベジェパスで接続されたノードがあります。
ユーザーがノードをドラッグするときは、接続パスをリアルタイムで更新する必要があります。ただし、速度が低下していることに気づきました(特に、1つのノードが他の多くのノードに接続されている場合、または複数のノードが同時にドラッグされている場合)。私はそれをプロファイリングしました、そして主な問題はここにあるようです:
これは、ソースプロパティまたは宛先プロパティのいずれかが変更されるたびに呼び出される関数です。パスを構成するジオメトリは、コントロールポイントが変更されるたびに内部で再生成されているようです。おそらく、関連するすべての依存関係プロパティが設定されるまで、ジオメトリが再生成されないようにする方法があったとしたらどうでしょうか。
編集: StreamGeometryを使用するMartのソリューションは、指数関数的に高速化しました。この機能はボトルネックにはほど遠いです。少し反映すると、PathGeometryは内部でStreamGeometryを使用し、依存関係のプロパティが変更されるたびに、StreamGeometryが再計算されます。したがって、この方法では仲介者を切り取るだけです。最終結果は次のとおりです。
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);
}
}
プロジェクトの完全なソースコードは、http://zeal.codeplex.comで入手できます。