2009-07-25 5 views
2

画面上の800x800ピクセルの正方形に100個のセミランダムポイントの間に100個の線を描く必要があります。画面上に800 * 800ピクセルのボックスを効率的に描画する必要があります

私は組み込みdrawlines &のdrawrecangles関数を.NETの内部で使用していましたが、フォームがペイントするたびに描画が消去されます。

私はメモリ内のビットマップに描画することを考えていましたが、それが良い解決策であるかどうかはわかりません。

ヒント?

答えて

3

これは良い考えであるだけでなく、名前(ダブルバッファリング)も持っています。フォームレベルのビットマップで描画し、フォームのPaintイベント(実際には、フォーム上のピクチャボックスでこれを行い、Paintイベントを使用する方が良いでしょう)では、GraphicsオブジェクトのDrawImageメソッドを使用して、ピクチャボックスへのビットマップ。

もっと簡単な方法は、ビットマップを作成して描画し、ピクチャボックスのImageプロパティとしてビットマップを設定することです。フォームが再描画されてもイメージは自動的に保持されます。

2

良いアイデアです。ビットマップに描画すると、ビットマップがフォームに描画されます。あなたのビットマップを修正した後、再描画(または同等のもの)を呼び出すだけです。

3

私のマシンのGDI +の性能が同等であると仮定して、それは良い考えではありません。 Formクラスは、既にDoubleBufferedプロパティを使用してダブルバッファリングをサポートしています。それはP/Invokeに浸ることはないと仮定した場合よりも優れた仕事をします。

私の測定:

  • 100ランダムなライン、ノーダブルバッファリング :68ミリ秒
  • 100ランダムなライン、ダブルバッファリング: 2.6ミリ秒
  • Graphics.drawImageを800x800x32PArgb、 なしダブルバッファリング、空の OnPaintBackground:9.8msec

もちろんこれはcですあなたが400本以上の線を引くときハンギングします。 WFのダブルバッファリングでは、BufferedGraphicsクラスを使用する必要があることがわかります。それは非常に不公平です。

1

ビットマップを描画して永続化したり、ペイントイベントを使用してフォームに描画することができます。

(この例では、画像ボックスPicture1の)ビットマップに描画するには、次の基本クラスで

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint 
e.Graphics.DrawRectangle(...) 
end sub 
0

BufferedGraphics間は非友好的であってもよい、this guy explains it well

dim g as graphics 
g = Graphics.FromImage(Picture1.Image) 
g.DrawRectangle(...) 

ペイントイベントを使用しますあなた自身のコントロールに使うことができます。

関連する問題