DOBON.NET DOBON.NETプログラミング掲示板過去ログ

.Netにおける図形の高速描画方法はありますか?

環境/言語:[Windows2000]
分類:[.NET]

.Netを最近はじめたばかりの者ですが、ここのページは大変参考にさせていただいております。そこで、どうしても質問したいことがあり、書き込み失礼させていただきます。
.Netの図形の描画速度に関してですが、以下の円の描画などに関して速度を計測したところどうもVB6の時に比べると速度が遅くなっているように思います。おそらく各描画メソッドの引数で必ずペン設定をしなければならず、描画の度にペン設定を繰り返すためなのかなと推測しています。(その理由かRectangleメソッドよりもペン設定が一度のRectanglesメソッドのほうが早い?).Netにおいて図形の高速表示のよいテクニックなどがありましたらご教授ください。

円の描画で計測(半径50の円を1000x1000箇所に描画)
[.Net]@HighSpeedAHighQuality
Dim i, j As Integer
Dim g As Graphics = PictureBox1.CreateGraphics()
g.Clear(Color.White)
For i = 0 To 1000
For j = 0 To 1000
'g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality’・・・A
g.SmoothingMode = Drawing2D.SmoothingMode.HighSpeed’・・・@
g.DrawArc(Pens.Black, i, j, 100, 100, 0, 360)’1001x1001回Pen設定
Next j
Next i
g.Dispose()
[VB6]
BCircleを使用時
Picture1.Cls
For i = 0 To 1000
For j = 0 To 1000
Picture1.Circle (i + 50, j + 50), 50
Next j
Next i
CAPIを使用時
Dim i As Long, j As Long
Picture1.Cls
For i = 0 To 1000
For j = 0 To 1000
 Call Arc(Picture1.hdc,i,j,100 + i,100 + j,50 + i,100 + j,50 + i,100 + j)
Next j
Next i

計測結果[.Net]@47秒A84秒 [VB6]B9秒C19秒
すみません再度投稿させていただきます。
前回書き込んだコードを私なりに改良したものを再度書き込みます。
その上で計測した結果を書きます。

前回のコードを以下の2つの方法で書き換えたもので計測
手法1
Dim myPen As New System.Drawing.Pen(Color.Black)とループの外で宣言し
g.DrawArc(myPen, i, j, 100, 100, 0, 360)
手法2 手法1とさらに
g.SmoothingMode = Drawing2D.SmoothingMode.HighSpeedのSmoothing設定がループ
中で毎回設定されていたのでこれもループの外にて設定した。

結果 前回の@Aの速度が
@手法1 40秒
 手法2 27秒
A手法1 76秒
 手法2 62秒
となりました。直接の遅さの原因はSmoothing設定を毎回ループ中に設定していたことでいたが、ループの外でPenオブジェクトをを作成し、それを渡しすようにするだけでも
多少速度が上がった(手法1)ことには驚いた。
しかし、それでもVB6のコードのCircle描画及びAPI描画には速度負けしているように
思います。

もしまだこれ以上.Netで速度向上が見込めるテクニックなど御座いましたらご教授
お願いします。
回答ではありませんが、「なぜ遅いか?」に関する簡単な説明が、

Bob Powell's GDI+ FAQ
Why so slow?
http://www.bobpowell.net/why_so_slow.htm

にあります。

DOBON.NET | プログラミング道 | プログラミング掲示板