1

私は C# の Windows 形式のプロジェクトに取り組んでおり、そのためには四角形のグリッドが必要です。正方形を生成できましたが、最大 20,736 個の正方形を生成する必要があるという問題があります。SDLライブラリを使用して問題なくC++でこれを行うことができましたが、C#では非常に多くの正方形で非常に悪いラグが発生しています。

正方形を 1/100 秒ごとに更新したいので、タイマーを使用して正方形を再描画していますが、ラグは信じられないほどです。最初にボタンのグリッドを生成しようとしましたが、プログラムが停止しました。次に、PictureBoxes のグリッドを試してみましたが、あまり改善されませんでした。次に、Pen と Rectangle を試しましたが、改善も見られました。では、画面に 20,000 個の正方形を描画する最も効率的な方法は何でしょうか?

    //Timer that ticks every 1/100th of a second 

    public void MyTimer_Tick(object sender,EventArgs eArgs)   {
          count++;
          numLabel.Text = count.ToString();
          for (int i = 0; i < 60; i++)
          {
              for (int j = 0; j < 60; j++)
              {
                  editSquares((i * (18 + 2)), (j * (18 + 2)), 18, 18, Color.Black);
              }
          }
    }

    //Draw a square

    public void drawSquares(int x, int y, int w, int h)
    {
        cell = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
        System.Drawing.Graphics formGraphics = this.CreateGraphics();
        formGraphics.FillRectangle(cell, new Rectangle(x, y, w, h));
        formGraphics.Dispose();
        cell.Dispose();
    }

    //Edit Squares      

    public void editSquares(int x, int y, int w, int h,Color color)
    {
        cell = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
        cell.Color = color;
        System.Drawing.Graphics formGraphics = this.CreateGraphics();
        formGraphics.FillRectangle(cell, new Rectangle(x, y, w, h));
        cell.Dispose();
    }
4

2 に答える 2

1

editSquares で毎回ブラシを作成して破棄する代わりに、起動時に必要な色ごとにブラシを作成し、関連するブラシをパラメーターとして渡します。Graphics オブジェクトについても同様です。

ただし、変更されたセルのみを再描画することで、おそらく最高の効率向上を実現できます。これを指摘してくれた Kal_Torak に感謝します。

于 2012-07-26T21:56:52.350 に答える
1

ここに詳述されている答えを試しましたか?

一番多い答えは、私たちが職場で行っている方法と同じです。私たちのアプリケーションはグラフィックスを多用するわけではありません (そのため、私たちのソリューションが最適であることを保証するものではありません) が、書き込み可能なビットマップ ロックにより、不必要なエラー チェックや画面の更新が防止される可能性があると思います。

于 2012-07-26T22:52:31.370 に答える