0

C# で CAD のようなアプリケーションを開発しています (フォーム、外部フレームワークなし)。パン、ズーム、選択を実装しました。しかし、マウスを動かすたびにすべての行を再描画するため、非常に遅くなります。

アプリをより速く、より効率的に構築する方法は? 1行だけを再描画する方法は?

描画用コード (標準パネル):

void pan_Paint(object sender, PaintEventArgs e)
{
    foreach (Entitie o in sketch.Entities)
    {
        if (o is Line)
        {
            Line l = (Line)o;
            Point p1 = pointScreen(l.P1.X.CurrentValue, l.P1.Y.CurrentValue);
            Point p2 = pointScreen(l.P2.X.CurrentValue, l.P2.Y.CurrentValue);
            e.Graphics.DrawLine(Pens.Black, p1, p2);
        }
    }
}

新しい行を描画する場合:

void pan_MouseMove(object sender, MouseEventArgs e)
{
    if (tmpEntitie != null)
    {
        Line l = (Line)tmpEntitie;
        l.P2 = e.Location;
        pan.Invalidate();
    }
}
4

2 に答える 2

0

スペースを領域または象限に分割し、現在のビューポートに表示されている領域にある場合にのみオブジェクトを再描画するスペース分割手法を使用する必要があると思います。

開始するためのリンクを次に示します。

http://en.wikipedia.org/wiki/Space_partitioning

http://en.wikipedia.org/wiki/Quadtree

ライブラリ:

http://www.vividsolutions.com/jts/jtshome.htm (Java トポロジ スイート)

http://code.google.com/p/nettopologysuite/ (C# の JTS)

于 2012-08-23T20:43:03.570 に答える
0

何かを学ぶためにそれを行うと仮定すると、最初のステップに対する答えはすでに得られています - 何に時間がかかり、いつかかるかを特定しました (「マウスを動かすたびに、すべての行を再描画します」)。次のステップは、「もっと早くできるか」の前に「今していることは何でもする必要があるか」です。マウスの移動ですべてを再描画する必要はないでしょう - 試してみて、それで十分かどうかを確認してください。すべてを 1 秒あたり 1000 回再描画するには時間がかかりますが、1 秒あたり 60 回 (またはそれ以下) で再描画する場合と目に見える違いはありません。

「もっと早くできるかな」と思っている場合は、目標を定義し、最初に何ができるかを測定してください。基本に固執したい場合は「ダブルバッファリング」を検索し、適切な 3d フレームワーク DirectX/XNA または OpenGL を検討し、WPF が機能するかどうかを確認してください。

于 2012-03-02T00:02:07.313 に答える