2
        private void button3_Click(object sender, EventArgs e)
    {

        this.DoubleBuffered = true;

            for (int i = 0; i < 350; i++)
            {
                using (Graphics g = this.CreateGraphics() )
                {
                    g.Clear(Color.CadetBlue);
                    g.DrawImage(Properties.Resources._256, 100, 100, i-150, i-150);
                }
            }
    }

DoubleBuffered を true に設定していると思っても、画像はまだちらつきます。私が間違っていることは何ですか?ありがとう!

4

3 に答える 3

6

Neil が指摘したように、ループの反復ごとに新しい Graphics オブジェクトを作成する必要はありません (すべきではありません)。これらは比較的高価なリソースであり、むやみに作成するべきではありません。

また、CreateGraphics を呼び出して、ボタンの Click ハンドラー内でそのようにペイントするべきではありません。これは問題を引き起こす可能性があります。最も顕著なのは、ペイント ハンドラが呼び出されたとき (つまり、ウィンドウが WM_PAINT メッセージを受信して​​更新されるたび) に描画が「元に戻される」ことです。OnPaint をオーバーライドしてすべての描画を行い、フォームを更新する必要がある場合は Invalidate() を呼び出すだけです。

ちらつきに関しては、通常、DoubleBuffered を true に設定すると処理されますが、独自のダブル バッファリングを展開するのは簡単です。試してみる。また、そのようなループでの描画は、おそらくやりたいことではないことに注意してください。ある間隔で 1 回更新する場合は、タイマーを使用します。コードはループが実行できる速さで実行されていますが、これは通常望ましくありません。

private void someTimer_Tick( ... )
{
    Invalidate();
}
protected override void OnPaint( PaintEventArgs e )
{
    using( var tempBmp = new Bitmap( ... ) )
    using( var g = Graphics.FromImage( tempBmp ) )
    {
        // draw to tempBmp
        e.Graphics.DrawImage( tempBmp, new Point( 0, 0 ) );
    }
}
于 2011-02-23T18:25:51.517 に答える
2

問題は、ループの反復ごとに新しいグラフィックスオブジェクトを作成していることです

forステートメントをusingステートメント内に移動すると、パフォーマンスが劇的に向上するはずです。

using (Graphics g = this.CreateGraphics() )
{
     for (int i = 0; i < 350; i++)
     {
        g.Clear(Color.CadetBlue);
        g.DrawImage(Properties.Resources._256, 100, 100, i-150, i-150);
     }
}

それと、ロードしているリソースファイルをローカル変数に移動することも良い考えかもしれません。

于 2011-02-23T18:22:55.487 に答える
2

ダブルバッファリングは Paint イベントでのみ有効です。CreateGraphics() を使用して画面に直接描画しています。g.Clear() 呼び出しは、描画された画像を即座に消去するため、非常に目立ちます。Paint イベントまたは OnPaint メソッドで描画しないことは、ほとんどの場合間違いです。

于 2011-02-23T18:36:10.093 に答える