2012-03-01 12 views
0

私はC#(フォーム、外部フレームワークなし)のようなCADアプリケーションを開発しています。パン、ズーム、セレクトを実装しました。マウスを動かす度にすべての行が再描画されるため、非常に遅いです。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(); 
    } 
} 
+0

C#は使用しないでください。最も基本的なアプリケーションでさえも関係するライブラリがあれば、あなたが描画で行うことのほとんどは潜在的です。また、あなたがまだ[OpenTK](http://www.opentk.com/)のようなものを探していることを提案していないなら、 –

+1

あなたのコードを表示できますか?また、.NETはグラフィックスにも優れているので、マウスを移動するたびに再描画しても、毎回変更領域を再描画するだけで問題はありません。 – Ryan

+0

.NETに慣れていれば、大部分のグラフィックスアプリケーションには高速です。ヒント:SetPixelを何度も呼び出すことは、あなたがやりたいことではありません:-) –

答えて

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)

0

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

"自分はもっと早くできるのですか"と自分自身を見つけたら、目標を定義し、最初に何を持っているかを測定します。適切な3DフレームワークのDirectX/XNAまたはOpenGLを検討し、WPFが機能するかどうかを確認するには、「ダブルバッファリング」を検索してください。

+0

これは私の最初の描画アプリなので、CADとベクトルアプリケーションの背後にある基本的な理論を学びたいと思います。ダブルバッファリングは良い提案のように見えます。 – banic

関連する問題