2

パネルをスムーズに再描画するにはどうすればよいですか?

panel1.Invalidate();300 ミリ秒ごとに panel() を無効にするタイマーを使用しています。その後、panel1_Paintそのパネルに画像を追加するイベントで、問題はジャンプしているように見え、その上で 1 つの画像をできるだけ速く移動する必要があることです。できる。

これは、スクリーン キャストの問題のリンクです。http://screencast.com/t/HdtIV99YN

 private void panel1_Paint(object sender, PaintEventArgs e)
            {
                PaintMapObstacles(e);
                PaintMapStartAndGoal(e);

                if (trayectoryIndex < 1000)
                {
                   MapPoint point =  GetTrayectoryPoint(0, trayectoryIndex);
                   e.Graphics.DrawImage(new Bitmap("robot.jpg"), point.X*squareSize, point.Y*squareSize, 60, 60);
                   trayectoryIndex++;
               }
            }
     private void PaintMapStartAndGoal(PaintEventArgs e)
            {
                MapPoint start = new MapPoint { X = 0, Y = 0 };
                MapPoint goal = new MapPoint { X = 7, Y = 8 };
                   // e.Graphics.DrawImage(new Bitmap("start.jpg"), start.X * squareSize, start.Y * squareSize, 60, 60);
                    e.Graphics.DrawImage(new Bitmap("goal.jpg"), goal.X * squareSize, goal.Y * squareSize, 60, 60);
                    isFirstRun = true;
            }


        private void PaintMapObstacles(PaintEventArgs e)
            {

                foreach (MapPoint mpoint in obstacles.Obstacles)
                {
                    e.Graphics.DrawImage(new Bitmap("obstacle.png"), mpoint.X * squareSize, mpoint.Y * squareSize, 60, 60);  
                }
            }

         private void PanelTimer_Tick(object sender, EventArgs e)
            {

                panel1.Invalidate();
            }
4

1 に答える 1

3

これは「ちらつき」と呼ばれ、ウィンドウを最初から再描画するときに常に発生するアーティファクトです。描画コードが非常に非効率的であるため、プログラムでは特に顕著です。ウィンドウの背景が描画され、古い絵が消去されているのがわかります。次に、ゆっくりとビットマップを背景に戻します。消去ステップは目に見え、ちらつきのように見えます。

ちらつきの一般的な解決策は、ダブル バッファリングです。最初にウィンドウの内容をビットマップに構成し、次にビットマップをすばやく画面にブリットします。これは Winforms の組み込み機能であり、DoubleBuffered プロパティによってオンになります。Panel クラスでは、デフォルトでダブルバッファリングが有効になっていません。これは、背景を描画する以外に独自に描画を行わないコンテナ コントロールとして設計されています。PictureBox は、デフォルトでダブルバッファリングが有効になっている場合でも同様に機能します。または、ここに示すように、Panel クラスのダブル バッファリングをオンにすることもできます。

最終的には描画コードの問題に対処する必要があります。非常に遅いだけでなく、OutOfMemoryException でプログラムがクラッシュする可能性があります。Bitmap クラスの使用方法に起因する問題であり、使用後に破棄する必要があります。System.Drawing オブジェクトには常にusingステートメントを使用してください。

ビットマップを一度だけ作成することで、はるかに高速になります。フォーム コンストラクターが最適な場所です。グリッドに合わせてビットマップを事前にスケーリングし、ピクセル形式に注意することで、非常に高速になります。PixelFormat.Format32bppPArgb は、ほとんどすべての最近のビデオ アダプターのフレーム バッファー形式と直接互換性があり、ビットマップは変換せずにフレーム バッファーに直接コピーできます。他のすべての形式よりも 10 倍高速です。変換コードはこちら.

于 2014-03-05T23:10:53.197 に答える