0

Graphics.FromImage() がどれほどコストがかかるかを確認するために、速度テストを行いたかったのです。

そのために、最初に Graphics.FromImage を繰り返し呼び出すループを実行しました。2 回目のテストでは、1 回だけ実行しましたが、エラーが発生しました。

    m_Buffer = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb)
    m_g = Graphics.FromImage(m_Buffer)

    For i As Integer = 0 To 1000
        Using m_g
            m_g.FillEllipse(New SolidBrush(Color.Blue), 0, 0, 100, 100)
        End Using
    Next i

(i=1) で、m_g.FilleEllipse 行に「無効なパラメーター」というエラーが表示されます。

4

2 に答える 2

1

おそらくあなたはこれを行うべきです

....
Using m_g
    For i As Integer = 0 To 1000
        Using blue As New SolidBrush(Color.Blue)
            m_g.FillEllipse(blue, 0, 0, 100, 100)
        End Using
    Next i
End Using
....

Graphicsオブジェクトへの参照は、ループの後に配置する必要があります。SolidBrushへの参照はループ内に配置する必要があります。

編集:

使用することは非常に重要です。特に、グラフィックハンドルやデータベース接続などのシステムリソースを扱う場合。Usingは、EndUsingで宣言されたオブジェクトを自動的に破棄するtry/finally句の代わりになります。これにより、例外が発生した場合でも、ガベージコレクタパスを待たずにシステムリソースが適切に破棄されることが保証されます。
上記のループでは、1000個のSolidBrushオブジェクト(および基盤となるシステムグラフィックスハンドル)が、システムグラフィックスメモリに圧力をかけることなく、すぐにフレッドされます。

于 2012-10-31T10:02:48.447 に答える
1

Graphics.FromImageこれは静的な呼び出しであり、usingステートメントをラップするとdisposeを呼び出そうとするためだと思います。つまり、次回は使用できません。

于 2012-10-31T09:52:16.567 に答える