在Windows窗体中有效地绘制网格

Joe*_*oel 6 c# graphics optimization drawing

我正在用C#编写Conway的生命游戏的实现.这是我用来绘制网格的代码,它在我的panel_Paint事件中.g是图形上下文.

for (int y = 0; y < numOfCells * cellSize; y += cellSize)
{
     for (int x = 0; x < numOfCells * cellSize; x += cellSize)
     {
          g.DrawLine(p, x, 0, x, y + numOfCells * cellSize);
          g.DrawLine(p, 0, x, y + size * drawnGrid, x);
     }
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的程序时,它没有响应,直到它完成绘制网格,这需要几秒钟在numOfCells = 100&cellSize = 10.删除所有乘法使它更快,但不是很多.

绘制网格有更好/更有效的方法吗?

谢谢

Tho*_*que 13

您不需要嵌套循环:

for (int i = 0; i < numOfCells; i++)
{
    // Vertical
    g.DrawLine(p, i * cellSize, 0, i * cellSize, numOfCells * cellSize);
    // Horizontal
    g.DrawLine(p, 0, i * cellSize, numOfCells * cellSize, i * cellSize);
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*lor 8

问题是你正在为每个Y坐标绘制X线.您可以先简化,只需在一个循环中渲染Y行,然后在另一个循环中渲染X行.

这是一个简单的例子

  for (int y = 0; y < numOfCells; ++y)
  {
    g.DrawLine(p, 0, y * cellSize, numOfCells * cellSize, y * cellSize);
  }

  for (int x = 0; x < numOfCells; ++x)
  {
    g.DrawLine(p, x * cellSize, 0, x * cellSize, numOfCells * cellSize);
  }
Run Code Online (Sandbox Code Playgroud)

随着您的进步,您可以使用双缓冲来减少任何闪烁等.请查看Control.SetStyle <br /> http://msdn.microsoft.com/en-us/library/system.windows.forms.control. setstyle.aspx