7

サブクラス化してDoubleBufferedtrueに設定したパネルがあります。常に図面を更新する必要がありますが、ちらつき、理由がわかりません。

private delegate void MyDelegate();

public void heartBeat()
    {
        while (true)
        {
            if (map.processNubots(rules))
            {
                if (this.InvokeRequired)
                {
                    this.Invoke((MyDelegate)delegate
                    {
                        //drawPanel.SuspendLayout();
                        drawPanel.Refresh();
                        displayGrid();
                        //drawPanel.ResumeLayout();
                    });
                }
                Thread.Sleep(500);
            }
            else
            {
                break;
            }
        }
    }

    public void displayGrid()
    {
        int i = 0;
        foreach (DictionaryEntry pair in map)
        {
            Monomer current = (Monomer)pair.Value;
            drawMonomers(current.getLocation(), current.getState());
            i++;
        }
    }

    public void drawMonomers(Point location, string state)
    {
        ...

        SolidBrush sb = new SolidBrush(mycolor);
        SolidBrush sbt = new SolidBrush(Color.Black);
        Graphics g = drawPanel.CreateGraphics();
        Font text = new Font("Arial", scale / 2);
        Pen pen = new Pen(Color.Black, 1);
        pen.Alignment = PenAlignment.Inset;
        g.FillEllipse(sb, offSet + ((location.Y * scale) / 2) + (location.X * scale), offSet + (-location.Y * scale), scale, scale);
        g.DrawEllipse(pen, offSet + ((location.Y * scale) / 2) + (location.X * scale), offSet + (-location.Y * scale), scale, scale);
        g.DrawString(state, text, sbt, (offSet + ((location.Y * scale) / 2) + (location.X * scale)) + scale / 6, (offSet + (-location.Y * scale)) + scale / 6);

        sb.Dispose();
        sbt.Dispose();
        pen.Dispose();
    }

したがって、すべての「計算」の後、架空のグリッドに何かを追加した後、パネルを更新して、この新しいアイテムをグリッドに表示する必要があります。関数の直前にパネルを無効にしてみましたdisplayGrid()が、さらにちらつきが発生するようです。

heartbeat()関数は現在、別のスレッドで呼び出されています。

これが私の新しいPanelクラスです。

public class Display : Panel
{
    public Display()
    {
        this.DoubleBuffered = true;

    }
}
4

3 に答える 3

0

AllPaintingInWmPaint スタイルを追加すると、背景が再描画されなくなります。

以前にこの投稿に出くわしたことがあり、非常に役立つことがわかりました。 C# (Windows フォーム) を使用してコントロールのダブル バッファリングを有効にするにはどうすればよいですか?

やり過ぎかもしれませんが、うまくいきます。私がユーザーに気づいたことの 1 つは、実行よりスムーズで高速に見える場合、 . (実際にはもう少し時間がかかりますが)

于 2013-06-02T13:42:33.870 に答える