【问题标题】:Making a grid of proceduraly generated squares in C#?在 C# 中制作程序生成的正方形网格?
【发布时间】:2012-07-26 21:44:57
【问题描述】:

我正在开发一个 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();
    }

【问题讨论】:

  • 纯粹出于好奇,为什么是 100 FPS 而不是 60?
  • 我忘记了屏幕只刷新 60 赫兹,所以 100 似乎是一个不错的整数。

标签: c# winforms


【解决方案1】:

你试过详细的答案here?

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

【讨论】:

    【解决方案2】:

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

    但是,可能通过仅重绘那些已更改的单元格来获得最佳效率增益 - 感谢 Kal_Torak 指出这一点。

    【讨论】:

    • 好问题,也许 OP 最适合回答这个问题 :)
    • 我忘记了整个 60fps。我会改的,谢谢。而且我不明白如何更改网格中特定矩形上的值,这就是我每次都在编写和重写的原因。
    • 我很确定您不能在 Winforms 中更改矩形的值,因为它是一个不保持状态的图形基元(与图形对象不同)。顺便说一句,在绘图速度方面,WPF 比 Winforms 更好,因为它在屏幕外绘制(而且更多的图形保持自己的状态,所以你不必这样做)。
    • 所以昨天我使用 SDL 在 C++ 中制作了生命游戏,我想在 C# 中执行此操作。我可以再次使用 SDL 吗? WPF 比 SDL 好吗?
    • 虽然,如果您不关心 60FPS 的完全重绘,如果您只更改已更改的单元格,您可能会使用 WPF 做得很好。
    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2018-11-25
    相关资源
    最近更新 更多