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

您是否尝试过此处详细说明的答案?

最佳答案与我们在工作中的做法相同。我们的应用程序不是超级图形密集型应用程序(所以我不保证我们的解决方案是最佳的),但我认为可写位图锁定可能会阻止不必要的错误检查或屏幕更新。

于 2012-07-26T22:52:31.370 回答
1

不是每次都在editSquares中创建和处理画笔,而是在启动时为您需要的每种颜色创建一个画笔,然后将相关画笔作为参数传递。Graphics 对象也是如此。

然而,可能最好的效率增益可以通过仅重新绘制那些已更改的单元格来获得 - 感谢 Kal_Torak 指出这一点。

于 2012-07-26T21:56:52.350 回答