Joel Joel - 5 months ago 108
C# Question

Efficiently draw a grid in Windows Forms

I'm writing an implementation of Conway's Game of Life in C#. This is the code I'm using to draw the grid, it's in my panel_Paint event. g is the graphics context.

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);

When I run my program, it is unresponsive until it finishes drawing the grid, which takes a few seconds at numOfCells = 100 & cellSize = 10. Removing all the multiplication makes it faster, but not by very much.

Is there a better/more efficient way to draw my grid?



The problem is that you are drawing the X lines for every Y coordinate. You can simplify first by just rendering the Y lines in one loop and then the X lines in another loop.

Here is a quick example

  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);

As you progress, you can use double buffering to reduce any flashing etc. Take a look at Control.SetStyle < br/>